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

本文通过两个简单C#类的实验,探讨了字段、方法及属性在继承中的表现,特别是new关键字的作用,以及其如何影响父类特性的展现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直觉得对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值