C# 抽象基类 - 扩展实现

本文关键字:扩展 实现 基类 抽象 | 更新日期: 2023-09-27 18:32:04

我有以下情况:

   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对象再具有 1 个属性:

public string Address{ get; set; }

实现这一点的最佳方法是什么?

我可以创建一个名为 GeoLocationEx : GeoLocation 的新类并将Address属性放置在那里,但是在我的 Concrete2 对象中,我将有 2 个属性:GeoLocation和我不喜欢的GeoLocationEx......

我还可以使地理位置类部分化,并使用Concrete2类的Address属性对其进行扩展,但我不确定这是否是部分类的"正确"使用。

最好的

方法是什么?

提前感谢您的帮助!

C# 抽象基类 - 扩展实现

您可能可以使用泛型:

        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