class BaseType
    {
        private string _label;
        private int[] _values;
        protected BaseType()
        {
            _label = "class name";
            _values = new int[10];
        }        protected BaseType(BaseType right)
        {
            _label = right._label;
            _values = right._values.Clone() as int[];
        }
    }    sealed class Derived : BaseType, ICloneable
    {
        private double[] _dValues = new double[10];        public Derived()
        {
            _dValues = new double[10];
        }        private Derived(Derived right):base(right)
        {
            _dValues = right._dValues.Clone() as double[];
        }        public object Clone() 
        {
            Derived rVal = new Derived(this);
            return rVal;
        }        static void Main(string[] args)
        {
            Derived d = new Derived();
            Derived d2 = d.Clone() as Derived;
            if (d2 ==null)
            {
                Console.WriteLine("null");
            }
        }
    }
为什么基类不实现IClonable接口,只通过提供一个收保护的构造函数,就可以让派生类可以拷贝基类的成员呢?

解决方案 »

  1.   

    这个问题看起来没有什么需要解释的,Clone()方法不需要遍历基类的成员,所以跟基类无关。就像代码实现的那样:Derived rVal = new Derived(this);为什么派生类可以拷贝基类的成员呢?== 为什么派生类可以构造基类呢?
      

  2.   

    还有个问题就是,既然父类的私有属性不可能被访问到,那还Clone父类的成员做什么?
      

  3.   

    首先明白一点的就是,基类的成员并没有被拷贝
    虽然d和d2的label,_values ,_dValues 都相等
    在这里需要明确的就是,基类的label和values 相等的原因是因为初始值
    d和d2,在实例化的时候values和values 其实都是初始值
    受保护的构造方法之复制了子类的_dValues的值