假設我想實現四個類型 參數的泛型類:可選類型參數
class ExampleClass<TA, TB, TC, TD>
{ }
類將有許多「使用情況」,因此它可能發生TA和TB是無意義而只有TC和TD需要或相反。有沒有一種優雅的方式來使某些類型參數可選?
假設我想實現四個類型 參數的泛型類:可選類型參數
class ExampleClass<TA, TB, TC, TD>
{ }
類將有許多「使用情況」,因此它可能發生TA和TB是無意義而只有TC和TD需要或相反。有沒有一種優雅的方式來使某些類型參數可選?
不,與C++模板不同,沒有「優雅」的方式;請參閱System.Tuple
蠻力方法。請注意,客戶端代碼通常並不那麼糟糕; ExampleClass.Create(...)
而不是new ExampleClass<T1, T2, T3>(...)
。
像往常一樣,這取決於。我可能會嘗試封裝用例中的一些靜態工廠方法,如下所示:
public class Example<TA, TB, TC, TD>
{
public TA PropA { get; set; }
public TB PropB { get; set; }
public TC PropC { get; set; }
public TD PropD { get; set; }
public static Example<T1, T2, Object, Object> Case1Factory<T1, T2>(T1 a, T2 b)
{
return new Example<T1, T2, Object, Object>()
{
PropA = a,
PropB = b
};
}
public static Example<object, object, T3, T4> Case2Factory<T3, T4>(T3 c, T4 d)
{
return new Example<Object, Object, T3, T4>()
{
PropC = c,
PropD = d
};
}
}
如果您需要支持超過3個或4個標準的情況下,我會改變做法。
可以將它與類型參數約束(基類)結合起來提供默認行爲,而不是使用'Object'作爲'可選'類型參數。 –
類型參數只是定義類成員的類型。如果在任何成員中使用類型參數,那些成員需要類型參數,因此它不能是可選的,但必須至少是Object
類型。然後你可以決定不使用那些成員,但是班級仍然需要這種類型。
此場景的最優雅的方式是,定義基本類型爲你的「可選」類型的參數,因爲這樣一來,你可以忽略使用非專業化的類型作爲類型參數的成員,因爲作爲時基類型提供任何功能類型參數。
一個例子:
public class MyClass<A, B> where A : BaseA, B : BaseB {
public A doSmth(B input)
{
return input.someMethod();
}
}
對於BaseA和BaseB的實現,沒有什麼特別應該,只要你想他們是可選在這裏發生,爲此和他們都可以使用。
我想也許你在錯誤的軌道上。你實際需要完成什麼?也許看實際問題可以給出一些關於如何解決問題的策略。 –
該類正在實現發佈訂閱功能。我想要做的是用請求響應模式來擴展這個類。我想把所有東西放在一個基類中。 – Ozkan
在這種情況下,我會嘗試做構圖,而不是繼承。你有兩種行爲中的一種,或者兩種都有。所以我會說你需要2個基類,每個行爲一個,然後用Facade發佈這兩個基類。如果您需要,我可以擴展我的答案。 –