2016-01-27 192 views
2

我看過How can I create an instance of a derived class from an instance of a base class and include private fields?Create an instance of derived class from the base class但是我沒有得到它,或者他們不是我想要的。如何從基類的實例初始化派生類的實例?

我有一個類,從另一個導出的,也實現特定接口:

public class DerivedClass : BaseClass, IDerivedClass 

BaseClass實現IBaseClassIDerivedClass繼承IBaseClass

有時,我希望能夠初始化派生類,當我已經有一個基類的實例。我可以創建一個構造函數,將基礎實例中的每個屬性簡單複製到派生類實例的屬性中,但是還有其他方法嗎?一些沿線:

BaseClass bc = new BaseClass(); 
DerivedClass dc = new DerivedClass() : bc; 

這是可行的嗎?如果不是,爲什麼不呢?我準備接受這可能是不可能的,但如果有的話,如果有人能解釋爲什麼,我會非常感興趣。

回答

0

不,這是不可能的。

您必須創建另一個對象,因爲它必須具有第二個對象的特徵。你不能只將一個拷貝到另一個。如果允許的話,你可能會遇到一個無效狀態的對象。

最好的辦法是創建一個'拷貝構造函數',就像你已經提到的那樣。

0

它不受該語言支持。 你能做的最好是你自己寫一個通用的複製方法中BaseClass

public T Copy<T>() 
    where T : BaseClass, new() 
{ 
    var copy = new T(); 
    // set all properties 
    return T; 
} 
+1

這是行不通的,因爲你不能設置派生類的屬性,當你不知道'T'。換句話說,在這個方法中,你只能設置基類的屬性。 – Maarten

+0

據我所知,這正是詹姆斯德克爾試圖實現的目標。 – wertzui