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

标签 c# oop inheritance

我有一个抽象基类 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/

相关文章:

c++ - 访问冲突 - 为什么基类析构函数被调用两次?

c# - CSV with\n\r in lines - 如何定义行尾?`

c# - X 交互后使用 TcpClient(套接字或流)通过网络发送和接收失败

c# - 异常后关闭流

python - 约束 python 容器内的类型和属性

javascript - JS OOP 和强制覆盖

减少基类中小子类数量的 Pythonic 方法?

c++ - 抽象类,如何调用函数print

c# - C# 中的错误代码通过 CLR 书

Javascript OOP 和继承技术