打开网易新闻 查看精彩图片

大家好,我是华山自控编程的朱老师

前几天一个学员在学习c#使用base关键字时。一直不理解base输出的值为什么不是父类的100,

而是输出了11:程序输出结果如下:

打开网易新闻 查看精彩图片

不知道什么原因。程序代码截图如下:

打开网易新闻 查看精彩图片

其实很多初学者在使用base关键字时,都会碰到这样问题:因为调用了base关键字时,就要输出父类的数据。下面我们就对这个问题进行详细分析。

问题分析:

这个代码第25行,this.a =a可以看出,在子类B并没有重新定义变量a,而是直接引用变量a,通过构造函数重新赋值。那么通过 "变量先定义,后赋值的逻辑",这个变量a就是父类的变量a.它和父类的变量a就是同一个。指向的是同一个内存地址。所以,这个时候,我们在子类中通过base.a使用的变量就是父类的变量。至于输出的值为什么不是父类的100,而是11呢?其实在子类构造函数中给变量a重新赋值后,这个时候,父类的变量a的值已经是11,再也不是初始值100了。因为子类修改的数据就是父类的变量a的数据。

那么有同学可能会问,如果我想在子类中输出父类的变量a的初始值100,该怎么实现呢?问得非常好。这里我们只需要通过一个关键字new就可以轻松实现。在继承类B中通过关键字new重新定义相同的变量a:代码截图如下:

打开网易新闻 查看精彩图片

再次运行程序,输出结果如下:

打开网易新闻 查看精彩图片

以上就是base,new关键字及继承特性的一些基本使用和总结,另外再延伸下相关的知识点:

base:用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数、实例方法和实例属性访问器中。

MSDN中小结的具体功能包括:

(1)调用基类上已被其他方法重写的方法。

(2)指定创建派生类实例时应调用的基类构造函数。

base常用于,在派生类对象初始化时和基类进行通信。 base可以访问基类的公有成员和受保护成员,私有成员是不可访问的。

tip:在多层的继承中,base可以指向的父类的方法有两种,一是有重载的情况下,base直接指向继承的父类成员的方法,二是没有重载存在的情况下,base可以指向任何上级父类的公有或受保护的方法。(好像是构造方法)

以上就是初学者在学习c#使用base,new关键字时常见的问题。总结如下:

1:base关键字访问的是父类的成员。可以在子类中修改父类的属性。

2:new关键字可以在子类中重新定义父类的相同属性。重新分配新的内存空间。