1

私は次の場合があります:

   public class GeoLocation
   {
       public double Longitude { get; set; }
       public double Latitude { get; set; }
       public string LocationName { get; set; }
   }

    public abstract class Base
    {
        public abstract GeoLocation GeoLocation { get; set; }
    }

    public class Concrete : Base
    {
        public override GeoLocation GeoLocation
        {
            get;
            set;
        }
    }

Concrete2ここで、からも継承するクラスを作成し、オブジェクトにもう1つのプロパティを持たBaseせたい場合:GeoLocation

public string Address{ get; set; }

これを実装するための最良の方法は何ですか?

と呼ばれる新しいクラスを作成し、そこにプロパティGeoLocationEx : GeoLocationを配置することもできますAddressが、Concrete2オブジェクトには、2つのプロパティがありGeoLocationますGeoLocationEx

GeoLocationクラスを部分的にしAddressて、クラスのプロパティで拡張することもできますConcrete2が、これが部分クラスの「適切な」使用であるかどうかはわかりません。

これを行うための最良の方法は何でしょうか?

よろしくお願いします!

4

2 に答える 2

2

おそらくジェネリックを使用できます:

        public class GeoLocation
        {
            public double Longitude { get; set; }
            public double Latitude { get; set; }
            public string LocationName { get; set; }
        }

        public class GeoLocationEx : GeoLocation
        {
            public double Address { get; set; }
        }

        public abstract class Base<T>
        {
            public abstract T GeoLocation { get; set; }
        }

        public class Concrete : Base<GeoLocation>
        {
            public override GeoLocation GeoLocation
            {
                get;
                set;
            }
        }

        public class Concrete2 : Base<GeoLocationEx>
        {
            public override GeoLocationEx GeoLocation
            {
                get;
                set;
            }
        }
于 2012-04-22T14:36:33.837 に答える
1
public class GeoLocation
{
    public GeoLocation(GeoLocation obj) {/* implement a copy constructor */}
    public GeoLocation() {/* default constructor */}

    public double Longitude { get; set; }
    public double Latitude { get; set; }
    public string LocationName { get; set; }
}

public class GeoLocationEx : GeoLocation
{
    public string Address { get; set; }
}

public abstract class Base
{
    public abstract GeoLocation GeoLocation { get; set; }
}

public class Concrete2 : Base
{
    private GeoLocationEx _geoLocation;
    public override GeoLocation GeoLocation
    {
        get { return _geoLocation; }
        set
        {
            _geoLocation = new GeoLocationEx(value);
        }
    }
}

クラス内でプライベートフィールドConcrete2を直接操作できるようになりました。GeoLocationExまた、Concrete2固有のものに対して追加のパブリック メソッドを公開することもできます。

コピー コンストラクターの記述については、MSDN を参照してください: http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx

于 2012-04-22T14:35:51.023 に答える