获得属性?

时间:2014-03-02 19:16:05

标签: c# polymorphism

有没有办法声明派生属性?

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时;我只看到汽车类型?

3 个答案:

答案 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)

属性确实可以在基类上声明abstractvirtual,并由派生类覆盖。但是在使用继承时,不能更改输入参数或返回函数/属性的类型。

如果您发现派生基数与基数之间的相同属性需要完全不同的类型,则可能需要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”,因为它已经是一个保留成员了。