2016-08-30 37 views
0

以下接口有內部我需要的接口有接受形而下類型,而不是接口在C#

public interface IHasCar{ 
    long IdCar {get;set;} 
    Car car {get;set;} 
} 

音樂會類型,我相信它不應該,由於合同的原因,所以我試圖 改變爲接口像這樣:

public interface IHasCar{ 
    long IdCar {get;set;} 
    ICar car {get;set;} 
} 

然後具體類汽車將實現ICAR任何類會有什麼 實施IHasCar可能是這樣的:

public foo : IHasCar{ 
    long IdCar {get;set;} 
    Car car {get;set;} 
} 

這將有具體的類車,它實現ICAR,所以富將 隱式實現IHasCar

遺憾的是它不工作,我需要從形而下級轎車第二屬性附加傷害,我該怎麼做,而不必形而下班車?

編輯

的,我從朋友得到的建議之一是寫一個函數返回我從汽車所需的值,這樣

public interface IHasCar{ 
    long IdCar {get;set;} 
    long GetCarOwnerNumber(long IdCar) {get;set;} 
} 

這並不像使用泛型一樣好,但它仍然可以接受?它會影響接口原理或類似的東西嗎?

回答

4

由於實現IHasCar的類不滿足接口的約定,它不會編譯,考慮它,接口接受ICar,ICar可以是Car或其他任何東西,那麼當您嘗試設置ICar時,它不是保證它會是一輛汽車,所以一切都會中斷。

如果需要具體的類,你可以做這樣的事情:

public foo : IHasCar 
{ 
    long IdCar { get; set; } 
    ICar car { get{ return mainCar; } set{ if(value is Car)mainCar = (Car)value; } } 
    Car mainCar{ get; set; } 
} 

通過這種方式,您可以使用mainCar訪問汽車及汽車實現的接口。

+0

另外,請注意,在我們的界面中使用具體類沒有問題。 – Gusman

+1

一個更清潔的方法是明確實施IHasCar.Car屬性 –

+0

對不起,我不明白你的意思是什麼...... – Gusman

2

這是generics的使用案例之一。

如果IHasCarICar,但你需要訪問ICar執行委員在IHasCar實現,那麼這表示在C#如下:

public interface ICar 
{ 
    // ICar members 
} 

public interface IHasCar<TCar> 
     where TCar : class, ICar 
     // TCar must be a class and it must implement ICar 
{ 
    TCar Car { get; set; } 
} 

現在,讓我們來實現一個ICarIHasCar<TCar>

public class Car : ICar 
{ 
} 

public class Garage : IHasCar<Car> 
{ 
    public Car Car { get; set; } 

    public void DestroyCar() 
    { 
     // Now here your Garage implements IHasCar<Car>, 
     // so Car property is typed as Car instead of IHasCar<Car> 
     // and you'll be able to access Car members too! 
    } 
} 
+0

謝謝你的建議,但我忘了提及我不想在這種特殊情況下使用generic ... – scapegoat

+0

@scapegoat爲什麼? –

+0

@scapegoat沒有泛型就沒有辦法優雅地解決你的問題。如果你想通過其他途徑,你會增加複雜性,並減少運行時間性能........... –

相關問題