2009-11-05 168 views
0

派生類的類型我試圖瞭解一些類似的職位,但不太瞭解他們的目的,我想我會解釋我自己...創建它在運行時

我有一個類 - 完全用包含屬性和方法的代碼定義。許多方法都是虛擬的,可以被派生類進一步覆蓋。所以,我有類似如下的

Class_Main 
    -- Class_A : Class_Main 
    -- Class_B : Class_Main 
    -- Class_C : Class_Main 
    -- Class_D : Class_Main 

然後我需要定義,可以從AD動態地推導出的一個多類...如:

Class_X : Class_A (or Class_B or Class_C or Class_D) 

,因爲我有額外的屬性和方法在Class_X內。由於C#不能從兩個實際類派生,但可以使用接口,但不能在接口中使用代碼,只需抽象簽名,我該如何去做這種實現。

由於

+0

你打算如何使用此範例實例化對象? – jheddings 2009-11-05 02:00:54

回答

1

你所描述的聽起來有點像duck typing。這在C#中不可用,因爲它是一種靜態類型的語言。也許當C#4出現時,dynamic會給你你正在尋找的東西。

如果Class_X需要被「填充」從這些類的功能,這將是共同來傳遞到類的實例化時:

public class Class_X { 
    private Class_Main _impl; 
    public Class_X(Class_Main impl) { 
     _impl = impl; 
    } 
} 

Class_X classXA = new Class_X(new Class_A()); 
Class_X classXB = new Class_X(new Class_B()); 

在這一點上,你Class_X實例有訪問所有派生類的Class_Main屬性&方法。這不會使得Class_X成爲一個聚合,它使您能夠使用Class_X(通過_impl對象)內的任何Class_Main的運行時行爲。

+0

這是我的想法,但不知道是否有另一種方式...然後我的class_X的方法會做類似於 返回_impl.SomeFunction(whateverParam)..謝謝 – DRapp 2009-11-05 12:17:11

0

從一類擴展和包括類X內的其它類,並且只是有適配器的方法直接在映射到類。

所以,現在正是C#,只是原型:

class ClassA { 
    public void FunctionClassA(...) { ... } 
    public void FunctionClassB(...) { ... } 
} 

class ClassX : ClassB { 
    private ClassA classa; 
    public ClassX() { 
    classa = new ClassA(); 
    } 
    public void FunctionClassA(...) { classa.FunctionClassA(...); } 
} 

所以,ClassX現在有一個函數從ClassA的繼承(由外觀),並含有ClassB的所有方法。