2017-02-10 65 views
0

假設我想實現四個類型 參數的泛型類:可選類型參數

class ExampleClass<TA, TB, TC, TD> 
{ } 

類將有許多「使用情況」,因此它可能發生TA和TB是無意義而只有TC和TD需要或相反。有沒有一種優雅的方式來使某些類型參數可選?

+1

我想也許你在錯誤的軌道上。你實際需要完成什麼?也許看實際問題可以給出一些關於如何解決問題的策略。 –

+0

該類正在實現發佈訂閱功能。我想要做的是用請求響應模式來擴展這個類。我想把所有東西放在一個基類中。 – Ozkan

+1

在這種情況下,我會嘗試做構圖,而不是繼承。你有兩種行爲中的一種,或者兩種都有。所以我會說你需要2個基類,每個行爲一個,然後用Facade發佈這兩個基類。如果您需要,我可以擴展我的答案。 –

回答

0

不,與C++模板不同,沒有「優雅」的方式;請參閱System.Tuple蠻力方法。請注意,客戶端代碼通常並不那麼糟糕; ExampleClass.Create(...)而不是new ExampleClass<T1, T2, T3>(...)

1

像往常一樣,這取決於。我可能會嘗試封裝用例中的一些靜態工廠方法,如下所示:

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個標準的情況下,我會改變做法。

+0

可以將它與類型參數約束(基類)結合起來提供默認行爲,而不是使用'Object'作爲'可選'類型參數。 –

-1

類型參數只是定義類成員的類型。如果在任何成員中使用類型參數,那些成員需要類型參數,因此它不能是可選的,但必須至少是Object類型。然後你可以決定不使用那些成員,但是班級仍然需要這種類型。

此場景的最優雅的方式是,定義基本類型爲你的「可選」類型的參數,因爲這樣一來,你可以忽略使用非專業化的類型作爲類型參數的成員,因爲作爲時基類型提供任何功能類型參數。

一個例子:

public class MyClass<A, B> where A : BaseA, B : BaseB { 

    public A doSmth(B input) 
    { 
     return input.someMethod(); 
    } 
} 

對於BaseA和BaseB的實現,沒有什麼特別應該,只要你想他們是可選在這裏發生,爲此和他們都可以使用。