微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个抽象的基类Base,它有一些共同的属性,以及许多派生的,它们实现不同的逻辑,但很少有其他字段.
public abstract Base
{
    protected int field1;
    protected int field2;
    ....

    protected Base() { ... }
}

有时我需要克隆派生类.所以我的猜测是,只需在我的基类中创建一个虚拟Clone方法,并且只在具有其他字段的派生类中覆盖它,但当然我的Base类不再是抽象的(这不是问题,因为它只有受保护的构造函数).

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();)(实际上在测试之后这是发生了什么,但也许我的测试设计得不好,这就是为什么我对它有疑问)
>有没有一种好的方法(模式)来实现一个基本的克隆方法,它可以按照我的预期工作,或者我必须在每个派生类中编写相同的代码(我真的想避免这种情况……)

谢谢你的帮助

解决方法

只需覆盖克隆并使用另一种方法来创建CreateInstance然后做你的东西.

这样你就可以只有Base类来避免泛型.

public Base
{
    protected int field1;
    protected int field2;
    ....

    protected Base() { ... }

    public virtual Base Clone() 
    { 
        var bc = CreateInstanceForClone();
        bc.field1 = 1;
        bc.field2 = 2;
        return bc;
    }

    protected virtual Base CreateInstanceForClone()
    {
        return new Base(); 
    }
}


public A : Base 
{     
    protected int fieldInA;
    public virtual Base Clone() 
    { 
        var a = (A)base.Clone();
        a.fieldInA =5;
        return a;
    }

    protected virtual Base CreateInstanceForClone()
    {
        return new A(); 
    }
}

原文地址:https://www.jb51.cc/csharp/97934.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐