2011-06-24 229 views
2

通常,給定類A,派生類DerivedFromA和A的實例,是否有方法從該實例構造DerivedFromA?假設我們說DerivedFromA簡單地覆蓋了A的一個或多個方法或屬性。比方說,我有一個帶有CreateA()方法的Container類,它返回A的一個實例,而且我不能或不願意'您想重寫或以其他方式混淆該Container類。我想要做的是取出由Container.CreateA()返回的實例,並將其傳遞給DerivedFromA(A instanceOfA)構造函數,並將結果對象視爲instanceOfA,並使用所有instanceOfA的方法,屬性和數據,除了我被覆蓋的那些。從父類的實例創建派生類的實例

順便說一句,有問題的語言是C#,它有所作爲。

謝謝。

+0

我不認爲你可以直接做到這一點。但是,您可能會使用類似[Castle DynamicProxy](http://www.castleproject.org/)來修改行爲 – Rob

+0

每隔一段時間(當我試圖寫一些複雜的東西時,幸運的是不是經常)我試圖讓我的頭看起來像一個簡單而優雅的概念。它似乎應該是一個委託或包裝或適配器模式,但我認爲你總是遇到阻礙你的事情。 (就像你不能重寫的方法或其他東西)。你可能最終會「裝飾」比你喜歡的更多的實例,但我想也許C#中最接近的東西是使用擴展方法... – mwardm

回答

2

您必須創建一個新的DerivedFromA實例,並使用該實例而不是原始實例。如果你這樣做,但是,它會正常工作。

只需添加一個構造函數像你表明:

public DerivedFromA(A instanceOfA) 
{ 
    // Copy members from instanceOfA into here as necessary 
    this.Foo = instanceOfA.Foo; 
    this.Bar = instanceOfA.Bar; 

    // Setup unique values 
    this.Baz = 42; 
} 

然後,當你打電話時,你可以這樣做:

DerivedFromA instance = new DerivedFromA(container.CreateA()); 
+0

我開始同意Rob的評論 - 你不能那樣做。這個答案是最接近的,但它不是我正在尋找的,因爲如果A的結構隨後被修改,我必須返回並修改DerivedFromA以反映新的方法,屬性等。 –

0

我可能會做這種像這樣一個新的虛擬方法:

public class ClassA { 
    public virtual string Foo { get; set }; 

    public virtual ClassA GetAsClassA() { 
     return this; 
    } 
} 


public class ClassB : ClassA { 
    public virtual string Foo { get; set }; 

    public override ClassA GetAsClassA() { 
     // Create new ClassA and copy properties as needed. 
     // Can use base.Foo to get base properties, as needed. 
    } 
} 

這將邏輯封裝到類本身中。