大家好,我是朱老师
前几天一个学员在学习c#使用base关键字时。一直不理解base输出的值为什么不是父类的,
而是输出了11:程序输出结果如下:
不知道什么原因。程序代码截图如下:
其实很多初学者在使用base关键字时,都会碰到这样问题:以为调用了base关键字时,就要输出父类的数据。下面我们就对这个问题进行详细分析。
问题分析:
这个代码第25行,this.a=a可以看出,在子类B并没有重新定义变量a,而是直接引用变量a,通过构造函数重新赋值。那么通过"变量先定义,后赋值的逻辑",这个变量a就是父类的变量a.它和父类的变量a就是同一个。指向的是同一个内存地址。所以,这个时候,我们在子类中通过base.a使用的变量就是父类的变量。至于输出的值为什么不是父类的,而是11呢?其实在子类构造函数中给变量a重新赋值后,这个时候,父类的变量a的值已经是11,在也不是初始值了。因为子类修改的数据就是父类的变量a的数据。
那么有同学可能会问,如果我想在子类中输出父类的变量a的初始值,该怎么实现呢?问的非常好。这里我们只需要通过一个关键字new就可以轻松实现。在继承类B中通过关键字new重新定义相同的变量a:代码截图如下:
再次运行程序,输出结果如下/p>
以上就是base,new关键字及继承特性的一些基本使用和总结,另外在延伸下相关的知识点/p>
base:用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中。
MSDN中小结的具体功能包括:
(1)调用基类上已被其他方法重写的方法。
(2)指定创建派生类实例时应调用的基类构造函数。
base常用于,在派生类对象初始化时和基类进行通信。base可以访问基类的公有成员和受保护成员,私有成员是不可访问的。
tip:在多层的继承中,base可以指向的父类的方法有两种,一是有重载的情况下,base直接指向继承的父类成员的方法,二是没有重载存在的情况下,base可以指向任何上级父类的公有或受保护的方法。(好像是构造方法)
以上就是初学者在学习c#使用base,new关键字时常见的问题。总结如下:
1:base关键字访问的是父类的成员。可以在子类中修改父类的属性。
2:new关键字可以在子类中重新定义父类的相同属性。重新分配新的内存空间。