gpt4 book ai didi

c# - 从基类方法克隆派生类

转载 作者:太空狗 更新时间:2023-10-29 19:52:24 24 4
gpt4 key购买 nike

我有一个抽象基类 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 { }
  1. 问题是,因为我不知道我的 Base 类中的派生类的类型,即使我调用它,这不会导致有一个 Base 类实例吗在派生的? (a.Clone();)(实际上在测试之后这是正在发生的事情,但也许我的测试设计不当,这就是我对此有疑问的原因)

  2. 是否有一个好的方法(模式)来实现一个基本的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com