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

    本文来自博#客#园

  • 相关阅读:
    iOS 网络编程:socket
    Zsh和Bash,究竟有何不同
    关于微软win10 2004的更新以及wsl2 Ubuntu18.04安装
    C# 委托事件机制 订阅发布
    关于Docker理念和安装,对Visual Studio2019自带生成的DockerFile配置,以及Docker镜像的发布与拉取
    div弹框
    vs分页
    ado显示下拉
    SQL server动态拼接存储过程分页
    退役
  • 原文地址:https://www.cnblogs.com/fej121/p/4255577.html
Copyright © 2011-2022 走看看