继承与构造函数(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 ...
随机推荐
- Android Studio 之 DataBing ,不需要再一个个findViewById了
使用DataBinding,不需要再一个个findViewById了 1.在 build.gradel 中 添加下面语句 dataBinding{ enabled true } 2.在 activit ...
- 微信小程序获取当前地理位置
获取用户地理位置,需要用到以下三个api方法: wx.getSetting() : 获取用户的授权列表信息 wx.openSetting():调起客户端小程序设置界面 wx.getLocation ...
- java性能优化之HashMap,LinkedHashMap,TreeMap读取大量数据效率的比较
很多时候,我们用jdbctemplate或mybatis的时候,为了查询通用,会选择使用map数据结构,因为hashmap本身无序,所以为了保证key的有序性,会采用linkedhashmap.所以我 ...
- ES开启慢查询日志
默认情况,慢日志是不开启的.要开启它,需要定义具体动作(query,fetch 还是 index),你期望的事件记录等级( WARN.INFO.DEBUG.TRACE 等),以及时间阈值. es有几种 ...
- 运维笔记--Debian/Ubuntu系统离线安装pymssql,连接SqlServer
场景描述: 开始之前,先对Debian和Ubuntu操作系统做个了解,两者都是Linux阵营中很有影响力的发行版本,可以简单理解成“Ubuntu源自Debian,两者系统操作命令基本相同,相比Ubun ...
- 支付宝小程序开发——如何获取支付宝小程序页面的https链接
前边介绍过通过配置支付宝Scheme协议alipays://来实现h5到小程序的跳转,其实还可以获取小程序页面的https格式链接,虽然支付宝官方并没有直接提供方案,但是通过小程序后台的“码管理”给页 ...
- Java12新特性 -- 默认生成类数据共享(CDS)归档文件
默认生成类数据共享(CDS)归档文件 同一个物理机/虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内 存占用是比较高的.所以Java团队引入了类数据共享机制 (Clas ...
- List containsKey 和Map contains 判断集合中是否包含某个值
map集合 //1.第一种 HashMap map = new HashMap(); map.put("1", "value1"); map.put(" ...
- [转]Oringin 2016 安装教程
觉得有用的话,欢迎一起讨论相互学习~Follow Me 原文ll链接 http://www.downza.cn/soft/282296.html 打开setup.exe 一路Next和Yes,任意输入 ...
- 自动以读写方式挂载ntfs(新)-苹果之路
之前的mac下挂载ntfs磁盘的方法在新版本的macos下失效了:<自动以读写方式挂载ntfs-黑苹果之路>,现提供一个有效的方法,系统版本:白苹果10.14.6,参见<Mac OS ...