我有以下情况:
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
的类Base
,我希望GeoLocation
对象还有一个属性:
public string Address{ get; set; }
实施此方法的最佳方法是什么?
我可以创建一个名为GeoLocationEx : GeoLocation
的新类并在那里放置Address
属性,但是在我的Concrete2对象中,我将有2个属性:GeoLocation
和GeoLocationEx
我不喜欢......
我还可以将GeoLocation类局部化并使用Address
类的Concrete2
属性对其进行扩展,但我不确定这是否是对部分类的“正确”使用。
这可能是最好的方法吗?
提前感谢您的帮助!
答案 0 :(得分: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;
}
}
答案 1 :(得分: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