2016-01-27 150 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