一个Public的字段引起的,谈谈继承中的new

一直觉得对c#面向对象这块已经掌握的很好了,因为正常情况下字段一般我们设计成私有的,今天突然想到一个实验,如下有两个很简单的类:

public class Farther
    {
        public int a = 100;
        public virtual int A
        {
            get
            {
                return a;
            }
        }
    }

    public class Son : Farther
    {
        public new int a = 200;
        public override int A
        {
            get
            {
                return a;
            }
        }
    }

注意字段是public的

那么对于下面的输出你能写出正确答案吗?

       Son obj = new Son();
            var obja = obj as Farther;
            Farther objb = obj;
            var objc = (Farther)obj;

            Console.WriteLine(obj.a);
            Console.WriteLine(obja.a);
            Console.WriteLine(objb.a);
            Console.WriteLine(objc.a);

            Console.WriteLine(obj.A);
            Console.WriteLine(obja.A);
            Console.WriteLine(objb.A);
            Console.WriteLine(objc.A);

            Console.ReadKey();

如果我将Son中的override注释掉那答案是什么?

public class Son : Farther
    {
        public new int a = 200;
        //public override int A
        //{
        //    get
        //    {
        //        return a;
        //    }
        //}
    }

下面贴答案

未注释:

已注释:

 

结论:无论是字段或是方法或是属性,加上new 都会在显示的通过父类访问时表现为父类的特征,这里方法和属性我们很常用,但是字段我们可以认为默认是sealed的,即使在子类中不加new也是new一个新的(会弹出一个警告),所以微软在设计的时候是非常统一的。在这里也回应有些人认为在继承中父类的字段会完全被覆盖而消失掉的问题。

本文来自博#客#园

posted @ 2015-01-28 13:34  为森  阅读(1291)  评论(7编辑  收藏  举报