2011-05-03 67 views
1

給定一個模板類,將只實例化說三個不同類型A,B和C,有沒有辦法將外部函數調用綁定到另一個類基於模板綁定到某個類型時的模板類型?C#:動態綁定一個函數,當模板綁定到類型

例如

class template<T> { 
    private printer myPrinter; 
    Print(T obj) {myPrinter.Print(obj); 
} 

class printer { 
    public Print(A obj){}; 
    public Print(B obj){}; 
    public Print(C obj){}; 
} 

現在以我的理解上面不起作用。

這給我留下了選擇的

1)編寫三個不同的類別,而不是模板(具有代碼三次,然後在編譯時靜態綁定的電話)。

2)改變設計,使得打印功能被包括在對象A,B和C,以及模板變化

class template<T> where T : IPrintable { 
    private printer myPrinter; 
    Print(T obj) {obj.Print()); 
} 

但是這將導致運行時功能的動態分辨率調用而且在我的情況下,打印功能在邏輯上更多地屬於打印機。

3)使用動態關鍵字,這些方針的東西:

class template<T> { 
    private printer myPrinter; 
    Print(T obj) {myPrinter.Print((dynamic)obj); 
} 

結合在這裏會發生在每個函數調用我會想象。因此,我真正想要的是一個解決方案,它保持打印機類中的功能(消除兩個),多次沒有代碼(消除1),並且動態地綁定打印功能,而不是每次調用但模板初始化(消除3)。

基本上我一開始創建模板就會想,運行時環境應該知道每次調用哪個函數,每次調用該函數時都不需要執行查找。

所以我的問題是,我的理解是正確的?當模板綁定到模板類型或者更好的方法做到上面時,是否有動態綁定的方法?什麼是使用動態與多個類的開銷?

感謝

+1

@codymanix他似乎在命名他的班級模板。 @Cookie:建議使用大寫的類。 – LueTm 2011-05-03 17:09:33

回答

0

製作方法Printprinter類的通用方法。

class Printer 
{ 
    public Print<T>(T obj) 
    { 
    if(obj is A) DoLogicForTypeA(); 
    else if (obj is B) DoLogicforTypeB(); 
    else throw new IllegalArgumentException(); 
    } 
} 

調用模板通用:

Print(T obj) {myPrinter.Print<T>(obj); 

你也許可以添加一些地方的約束,以使其更好地工作。

+0

同樣,這不足以讓我的打印功能有足夠的自由度。我基本上需要一個if類型= A,使用內部成員subscriptionsForA,如果type = B,使用subscriptionsForB,... – Cookie 2011-05-04 09:15:24

+0

我用if結構編輯它。如果你認爲'DoLogicForTypeA'和'DoLogicforTypeB'有很多共同之處,爲常見的東西定義一個接口並且定義一個常量'where T:InterfaceCommonToTypes'。然後你可以使用'obj。在'Print (T obj)'方法內的InterfaceCommonMethodOrProperty'。 – ZoolWay 2011-05-04 09:21:01