C#   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c# – 在派生类中可克隆大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一个A类和B类,它来自A:

class A : ICloneable
{
    public object Clone() {...}
}

class B : A,ICloneable
{
    public object Clone() {...}
}

这使

'B.Clone()' hides inherited member 'A.Clone()'. Use the new keyword if hiding was intended.

警告.

(1)建议的方式是什么?使用新的或声明A.Clone()作为虚拟和覆盖B?

(2)如果A中有一些成员并且在A.Clone()中正确克隆,是否有一种简单的方法可以在B.Clone()中克隆它们,还是必须在B.Clone()中明确克隆它们?

解决方法

如果你有权访问你的源码(我猜是这里的情况),那么绝对将它声明为虚拟并覆盖它.如果用新的隐藏基础克隆可能是个坏主意.如果任何代码不知道它正在使用B,那么它将触发错误的克隆方法而不返回正确的克隆.

关于属性的赋值,也许考虑实现复制构造函数,每个级别都可以处理自己的克隆:

public class A : ICloneable
    {
        public int PropertyA { get; private set; }

        public A()
        {

        }

        protected A(A copy)
        {
            this.PropertyA = copy.PropertyA;
        }

        public virtual object Clone()
        {
            return new A(this);
        }
    }

    public class B : A,ICloneable
    {
        public int PropertyB { get; private set; }

        public B()
        {

        }

        protected B(B copy)
            : base(copy)
        {
            this.PropertyB = this.PropertyB;
        }

        public override object Clone()
        {
            return new B(this);
        }
    }

每个拷贝构造函数调用基本拷贝构造函数,将其自身传递给链.每个继承级别直接复制属于它的属性.

编辑:如果您使用new关键字隐藏基本实现,这里有一个可能发生的示例.有一个示例实现(面对它看起来很好)

public class A : ICloneable
{
    public int PropertyA { get; protected set; }

    public object Clone()
    {
        Console.WriteLine("Clone A called");
        A copy = new A();
        copy.PropertyA = this.PropertyA;
        return copy;
    }
}

public class B : A,ICloneable
{
    public int PropertyB { get; protected set; }

    public new object Clone()
    {
        Console.WriteLine("Clone B called");
        B copy = new B();
        copy.PropertyA = this.PropertyA;
        copy.PropertyB = this.PropertyB;
        return copy;
    }
}

但是当你使用它时:

B b = new B();
A a = b;
B bCopy = (B)a.Clone();
//"Clone A called" Throws InvalidCastException! We have an A!

大佬总结

以上是大佬教程为你收集整理的c# – 在派生类中可克隆全部内容,希望文章能够帮你解决c# – 在派生类中可克隆所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: