簡體   English   中英

C#抽象基類 - 擴展實現

[英]C# abstract base class - extending the implementation

我有以下情況:

   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;
        }
    }

現在,如果我創建一個繼承自Base的類Concrete2 ,並且我希望GeoLocation對象還有一個屬性:

public string Address{ get; set; }

實現這個的最佳方法是什么?

我可以創建一個名為GeoLocationEx : GeoLocation的新類GeoLocationEx : GeoLocation並在那里放置Address屬性但是在我的Concrete2對象中,我將有2個屬性: GeoLocationGeoLocationEx我不喜歡...

我也可以使GeoLocation類局部化,並使用Concrete2類的Address屬性擴展它,但我不確定這是否是對部分類的“正確”使用。

什么是最好的方法呢?

在此先感謝您的幫助!

你可以使用泛型:

        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;
            }
        }
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM