2009-02-23 82 views
2

我有一個通用的類型參數的接口:聲明繼承泛型複雜類型約束

public interface IDriveable<T> where T : ITransmission { ... } 

我也有具有需要是接口類型的類型參數的類:

public class VehicleFactory<T> where T : /* ??? */ 

這個聲明有一個問題。我不能放置「IDriveable」,因爲它沒有類型參數,並且與IDriveable的類型簽名不匹配。但我也不想把IDriveable <U>或者,因爲然後VehicleFactory必須知道什麼種類 IDriveable它越來越。我希望VehicleFactory能夠接受任何類型的IDriveable。

提出的解決方案同事必須是使用:

但我不喜歡這樣,因爲它是多餘的。我不得不說「U」型兩次:

var factory = new VehicleFactory<IDriveable<AllWheelDrive>, AllWheelDrive>(); 

問號應該怎麼走?

+0

爲什麼必須IDriveable 是一個參數?你不能在課堂內使用IDriveable ,只能得到AllWheelDrive參數嗎? – configurator 2009-02-23 08:57:16

回答

0

這是否適合您?

這將讓工廠知道什麼類型的driveables是。

+0

它看起來像你比我快一分鐘,完全相同的答案;-) – Mouk 2009-02-23 06:20:21

+0

這似乎不是最佳。我不需要寫「VehicleFactory ,AllWheelDrive>」嗎?這是多餘的。 – sassafrass 2009-02-23 06:22:04

0

您可以使用2種類型的泛型定義VehicleFactory,並將其中的一個與接口對齊。這樣的事:

public class VehicleFactory<T1,T2> where T1 : IDriveabel<T2> 

我希望這不是你與可驅動的東西。我猜U是一個特定的類型。 Like String等

3

什麼是VehicleFactory去與T?它是否真的需要約束才能工作,還是僅僅爲了開發人員的完整性檢查?

這一輪常用的方法是申報非通用接口(IDriveable),然後進行仿製一個擴展是:

public interface IDriveable {} 
public interface IDriveable<T> : IDriveable {} 
public class VehicleFactory<T> where T : IDriveable 

如果希望廠家能夠做的事情與T,您可以將IDriveable<T>中不關心T的任何接口成員放入非通用IDriveable