我有一个抽象基类 Base
,它有一些共同的属性,还有许多派生类,它们实现不同的逻辑但很少有额外的字段。
public abstract Base
{
protected int field1;
protected int field2;
....
protected Base() { ... }
}
有时我需要克隆派生类。所以我的猜测是,只需在我的基类中创建一个虚拟 Clone
方法,并且只在具有附加字段的派生类中重写它,当然我的 Base
类不会不再是抽象的(这不是问题,因为它只有一个 protected
构造函数)。
public Base
{
protected int field1;
protected int field2;
....
protected Base() { ... }
public virtual Base Clone() { return new Base(); }
}
public A : Base { }
public B : Base { }
问题是,因为我不知道我的 Base 类中的派生类的类型,即使我调用它,这不会导致有一个
Base
类实例吗在派生的? (a.Clone();
)(实际上在测试之后这是正在发生的事情,但也许我的测试设计不当,这就是我对此有疑问的原因)是否有一个好的方法(模式)来实现一个基本的
Clone
方法,它会像我期望的那样工作,或者我是否必须在每个派生类中编写相同的代码(我'我真的很想避免这种情况……)
谢谢你的帮助
最佳答案
您可以向您的基类添加一个复制构造函数:
public abstract Base
{
protected int field1;
protected int field2;
protected Base() { ... }
protected Base(Base copyThis) : this()
{
this.field1 = copyThis.field1;
this.field2 = copyThis.field2;
}
public abstract Base Clone();
}
public Child1 : Base
{
protected int field3;
public Child1 () : base() { ... }
protected Child1 (Child1 copyThis) : base(copyThis)
{
this.field3 = copyThis.field3;
}
public override Base Clone() { return new Child1(this); }
}
public Child2 : Base
{
public Child2 () : base() { ... }
protected Child (Child copyThis) : base(copyThis)
{ }
public override Base Clone() { return new Child2(this); }
}
public Child3 : Base
{
protected int field4;
public Child3 () : base() { ... }
protected Child3 (Child3 copyThis) : base(copyThis)
{
this.field4 = copyThis.field4;
}
public override Base Clone()
{
var result = new Child1(this);
result.field1 = result.field2 - result.field1;
}
}
关于c# - 从基类方法克隆派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19119623/