继承与构造函数(base关键字)
1、背景
我:虽然通过继承减少了代码冗余,但是,每一个子类的构造函数还是需要给所有属性赋值的,很麻烦的。
师:这个好办,用base就行啦。
我:贝司?还吉他呢!
师:别急,首先我们先介绍下实例化子类对象的时候调用父类构造函数。

运行结果:

从上面代码分析可知:
(1)执行 ChildClass child=new ChildClass(); 会首先调用父类无参构造函数(这个构造函数一定是无参构造函数),然后再调用子类无参构造函数,所以会先显示
(2)然后再执行child.SayHello(); 因为子类是继承父类的,所以直接调用父类的SayHello()方法,所以显示
总结一下:
在实例化子类对象的时候,总是要调用父类的构造函数,并且总是调用无参构造函数【注意:除非是显示指定用base调用其他有参构造,其他情况都是默认调用无参构造,为什么要默认调用无参构造呢?因为子类需要用父类的一些数据,比如属性等,如果父类没有默认无参构造初始,那么调用会报错的,所以C#会默认调用父类的无参构造】。
如果父类没有无参构造函数,那么子类的构造函数就会报错

也就说说,子类是非常认死理的。必须去调用父类无参构造函数。这也是编程中容易出错的地方。父类没有编写无参构造函数,导致子类无法编译。
这时候解决错误有两种方法:
(1)直接手动编写父类无参构造函数
(2)在子类构造函数中使用base调用父类中的其他构造函数。Base后面括号中的实际参数需要与被调用的父类构造函数参数保持一致。
2、Base的用法
base其实最大的使用地方在面相对象开发的多态性上,base可以完成创建派生类实例时调用其基类构造函数或者调用基类上已被其他方法重写的方法。
Base有两个用途
(1)在派生类中调用基类构造函数
(2)在派生类中调用基类的方法
2.1关于base调用基类构造函数
public class A
{
public A()
{
Console.WriteLine("Build A");
}
}
public class B:A
{
public B():base()
{
Console.WriteLine("Build B");
}
static void Main()
{
B b = new B();
Console.ReadLine();
}
}
输出:

base调用基类有参构造和无参构造都可以的哦。
class B:A
{
public B():base()
{
Console.WriteLine("Build B");
}
public B(string name) : base()
{
Console.WriteLine(name + "Build B(有参构造)");
}
/*
public B(string name) : base(name)
{
Console.WriteLine(name + "Build B(有参构造)");
}
//*/ public override void Hello()
{
base.Hello();//调用基类的方法
Console.WriteLine("Hello,我是 B");
}
}
class A
{
public A()
{
Console.WriteLine("Build A");
}
public A(string name)
{
Console.WriteLine(name+"Build A(有参构造)");
}
public virtual void Hello()
{
Console.WriteLine("Hello,我是A");
}
}
static void Main(string[] args)
{ B b = new B("祥子"); Console.ReadLine();
}
运行结果:

2.2关于base在派生类中调用基类的方法。
public class A
{
public virtual void Hello()
{
Console.WriteLine("Hello");
}
}
public class B : A
{
public override void Hello()
{
base.Hello();//调用基类的方法,显示Hello
Console.WriteLine("World");
}
}
这样如果程序调用B.Hello()获得的效果将会使Hello World.
继承与构造函数(base关键字)的更多相关文章
- base关键字
base关键字 专门用来在子类访问父类成员 base.标识符:“.”调用父类同名属性.同名函数.构造函数 ()父类person public class Person { public Pe ...
- this与base关键字
this关键字 this关键字代表当前对象,通过this关键字可以访问当前对象的成员.(当前对象的成员:自己本身的成员+从父类继承过来的所有的成员.) this关键字可以访问:本类的所有成员和父类的非 ...
- C#类继承中构造函数的执行序列
不知道大家在使用继承的过程中有木有遇到过调用构造函数时没有按照我们预期的那样执行呢?一般情况下,出现这样的问题往往是因为类继承结构中的某个基类没有被正确实例化,或者没有正确给基类构造函数提供信息,如果 ...
- new关键字 、this关键字、base关键字
使用new,所做的三件事: 1. (类是引用对象,引用对象是在堆中开辟空间)在堆中开辟空间 2. 在开辟的堆空间中创建对象 3. 调用对象的构建函数 4. 隐藏父类成员:子类的成员可以与隐藏从父类继承 ...
- C#中base 关键字的作用
引用:http://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx base base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的 ...
- C#基础知识一之base关键字
前言 其实很早就想写关于C#基础,总是自己给自己找借口,或者去网上搜搜看看,现在想想觉得自己有点懒惰... 作为开发人员,基础知识是重中之重的,只有巩固.理解.实践才能提高自身的技能.同时也希望通过 ...
- C#之base关键字
1.base关键字用于从派生类中访问基类的成员. 2.调用基类上已被其他方法重写的方法. 3.指定创建派生类的实例是应调用基类的构造函数. 4.访问基类的公有成员和受保护成员,不能访问私有成员 5在静 ...
- C++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数
构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数 ...
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类 ...
- 【C++ Primer | 15】继承的构造函数
继承的构造函数 子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递.如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数. cl ...
随机推荐
- tidyr
tidyr包主要提供了数据整理和清洗的功能,包括 1. 数据框的变形 2. 处理数据框中的空值 3. 根据一个表格衍生出其他表格 4. 实现行或列的分隔和合并 该包将要用的数据处理成标准且统一的数据框 ...
- 【Beta】Scrum meeting 5
目录 写在前面 进度情况 任务进度表 Beta-1阶段燃尽图 遇到的困难 照片 commit记录截图 小程序前端仓库 后端代码仓库 技术博客 写在前面 例会时间:5.9 22:30-23:30 例会地 ...
- Java NIO Buffer详解
一.ByteBuffer类型化的put与get方法 /** * ByteBuffer类型化的put与get方法 */ public class NioTest5 { public static voi ...
- Metasploit使用内网跳板, 扫描局域网主机
最近,拿到一台内网机器, 苦于无法使用nmap扫描改主机的内网, 所以才有此文 在跳板机子获取一定权限后,需要积极的向内网主机权限发展,获取指定的目标信息,探查系统漏洞,借助msf已经得到的meter ...
- 《Go语言实战》读书笔记
<Go语言实战>中文版pdf 百度网盘: https://pan.baidu.com/s/1kr-gMzaPAn8BFZG0P24Oiw 提取码: r6rt 书籍源码:https://gi ...
- (转nginx不浏览直接下载文件的解决方法
原文:https://www.zhan200.com/xwt/39.html 如果nginx配置不对,就会造成部分文件,在浏览器中不是直接预览,而是进行了下载.修改的方法是修改配置文件.具体解决方法如 ...
- C# 动态创建EXE
1.创建项目SaveExe或者修改代码中SaveExe名字为自己的项目 2.添加按钮调用CreateCodeEXE,即可实现编译生成一个新的exe即 复制了自身的exe生成一个新的exe(目的就是新生 ...
- IDEA强制清除Maven缓存
目录 重新导入依赖的常见方式 存在的问题 彻底清除IDEA缓存的方式 重新导入依赖的常见方式 下面图中的刷新按钮,在我的机器上,并不能每次都正确导入pom.xml中写的依赖项,而是导入之前pom.xm ...
- RestHighLevelClient查询es
本篇分享的是es官网推荐的es客户端组件RestHighLevelClient的使用,其封装了操作es的crud方法,底层原理就是模拟各种es需要的请求,如put,delete,get等方式:本篇主要 ...
- Why Python's Integer Division Floors ---- python int(6/-132)时答案不一致,向下取整
leetcode150题中有一个步骤: int(6/-132) == 0 or ==-1? 在自己本地python3环境跑是int(6/-132) =0,但是提交的时候确实-1. 查找相关资料解惑: ...