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

本文来自博#客#园

转载于:https://www.cnblogs.com/fej121/p/4255577.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值