有没有办法声明派生属性?
public class Vehicle {
public VehicleType Type { get; set; }
}
public class Car : Vehicle {
public CarType Type { get; set; }
}
public class VehicleType {}
public class CarType : VehicleType {}
这样当我调用Car.Type时;我只看到汽车类型?
答案 0 :(得分:4)
你做不到。 Type
属性必须在基类和派生类中具有相同的类型。
这样做的一种方法是使用泛型:
public class Vehicle<TVehicleType> where TVehicleType: VehicleType {
public TVehicleType Type { get; set; }
}
public class Car : Vehicle<CarType> { }
Car car = new Car();
car.Type = new CarType();
答案 1 :(得分:2)
属性确实可以在基类上声明abstract
或virtual
,并由派生类覆盖。但是在使用继承时,不能更改输入参数或返回函数/属性的类型。
如果您发现派生基数与基数之间的相同属性需要完全不同的类型,则可能需要design smell。也许遗产不是你真正想要的。
如果你仍然认为你需要这样的东西,你可以利用generics:
class Base<T>
{
public virtual T MyProp { /* ... */ }
}
// Derived class that uses string for prop
class Derived1 : Base<string>
{
public override string MyProp { /* ... */ }
}
// Derived class that uses int for prop
class Derived2 : Base<int>
{
public override int MyProp { /* ... */ }
}
答案 2 :(得分:0)
这样的事情应该有效:
public class Car : Vehicle {
public CarType Type
{
get { return base.Type; }
set { base.Type = value; }
}
}
我建议不要使用名称“Type”,因为它已经是一个保留成员了。