zoukankan      html  css  js  c++  java
  • 一个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一个新的(会弹出一个警告),所以微软在设计的时候是非常统一的。在这里也回应有些人认为在继承中父类的字段会完全被覆盖而消失掉的问题。

    本文来自博#客#园

  • 相关阅读:
    内存溢出和内存泄漏的区别
    测试管理三要素(人员、过程和技术)
    面试可提问的6个问题
    弱网测试(二)
    js捕获错误
    TortoiseGit自动记住用户名密码的方法
    win7 "com surrogate“ 已停止工作的解决办法
    仿百度图片毛玻璃效果
    毛玻璃效果
    vimium快捷键列表
  • 原文地址:https://www.cnblogs.com/fej121/p/4255577.html
Copyright © 2011-2022 走看看