2014-03-02 165 views
1

有沒有方法來聲明派生屬性?派生屬性?

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;我只看到汽車類型?

+1

您當前密碼的注意事項:你有兩個不同的'Type'特性,一個在' Car'隱藏了另一個,並且應該有'new'關鍵字來澄清這一點(它不會「覆蓋」另一個)。 –

回答

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(); 
0

像這樣的東西應該工作:

public class Car : Vehicle { 

    public CarType Type 
    { 
     get { return base.Type; } 
     set { base.Type = value; } 
    } 
} 

我不會使用名稱「類型」,因爲這是保留的成員已經建議。

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 { /* ... */ } 
}