父类的构造函数总是在子类之前执行的。既先初始化静态构造函数,后初始化子类构造函数。

public class BaseCircle {
public BaseCircle()
{
Console.WriteLine(" no arguments base constructor!!!");
}
public BaseCircle(double arg)
{
Console.WriteLine("double arg base constructor!!!");
}
} public class SubCircle : BaseCircle {
public SubCircle():base()
{
Console.WriteLine("sub class no argument constructor,actually call base constructor !!!");
} public SubCircle(double a):base(a)
{
Console.WriteLine("sub class with argument, actually call base double constructor!!!");
} public SubCircle(int k):this(1,2)
{
Console.WriteLine("sub class with argument int k, actually call sub class constructor int i & j !!!");
} public SubCircle(int i,int j)
{
Console.WriteLine("sub class with int i&j argument!!!!");
}
} static void Main(string[] args)
{
SubCircle s1 = new SubCircle();
SubCircle s2 = new SubCircle(1.1);
SubCircle s3 = new SubCircle(1);
输出结果:
no arguments base constructor!!!
sub class no argument constructor,actually call base constructor !!! double arg base constructor!!!
sub class with argument, actually call base double constructor!!! no arguments base constructor!!!
sub class with int i&j argument!!!!
sub class with argument int k, actually call sub class constructor int i & j !!!

用法二:                                                                                                                                                                                                                        

是不是很模糊这两个关键字那?

哈,现在我来写份代码,代码可是最有说服力的啦!

 class BaseClass
{
private int numA;
public BaseClass()
{
Console.WriteLine("基类的无参数构造函数. value:{0}", numA);
}
public BaseClass(int i)
{
this.numA = i;
Console.WriteLine("基类带一个参数的构造函数. value:{0}", numA);
}
}
class ChildClassA : BaseClass
{
private int numB;
public ChildClassA()
{
Console.WriteLine("子类无参数构造函数. value:{0}", numB);
}
public ChildClassA(int i)
{
this.numB = i;
Console.WriteLine("子类带有一个参数的构造函数. value:{0}", numB);
}
public ChildClassA(int i, int j)
: base(i)
{
this.numB = j;
Console.WriteLine("子类带有两个参数的构造函数. value:{0}", numB);
}
}
class ChildClassB : BaseClass
{
private int numB;
public ChildClassB()
{
Console.WriteLine("子类无参数构造函数. value:{0}", numB);
}
public ChildClassB(int i)
{
this.numB = i;
Console.WriteLine("子类带有一个参数的构造函数. value:{0}", numB);
}
public ChildClassB(int i, int j)
: this(i)
{
this.numB = j;
Console.WriteLine("子类带有两个参数的构造函数. value:{0}", numB);
}
}
class Demo
{
static void Main(string[] args)
{
Console.WriteLine("使用base\n");
ChildClassA a = new ChildClassA(2, 4);
Console.WriteLine();
Console.WriteLine("----------------------------------------\n");
Console.WriteLine("使用this\n");
ChildClassB b = new ChildClassB(2, 4);
Console.ReadKey();
}
}

执行的结果如下:

--------------------------------结果----------------------------------

使用base

基类带一个参数的构造函数. value:2
子类带有两个参数的构造函数. value:4 ---------------------------------------- 使用this 基类的无参数构造函数. value:0
子类带有一个参数的构造函数. value:2
子类带有两个参数的构造函数. value:4 --------------------------------结果--------------------------------

this只是调用本身,但是这样是需要调用一次基类没有参的构造函数,所以会多显示一条“基类的无参数构造函数. value:0”。

base是调用基类的有参数构造函数。

c# base 和this 继承的更多相关文章

  1. c# base和this关键字总结

    base:用于在派生类中实现对基类公有或者受保护成员的访问,但是只局限在构造函数.实例方法和实例属性访问器中.MSDN中小结的具体功能包括:    (1)调用基类上已被其他方法重写的方法.     ( ...

  2. Yii2的深入学习--继承关系

    想要了解 Yii2 的话,一定要对 Yii2 中相关类的继承关系有所了解.由于暂时读的代码有限,下面的图中只列出了部分继承关系,之后回跟着源码阅读的越来越多而增加 由上图可以看到 Yii2 中大多数类 ...

  3. Python 类继承,__bases__, __mro__, super

    Python是面向对象的编程语言,也支持类继承. >>> class Base: ... pass ... >>> class Derived(Base): ... ...

  4. C++中的类继承(1) 三种继承方式

    继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程. ...

  5. Django(五)母版继承、Cookie、视图装饰器等

    大纲 一.内容回顾 补充:默认值 补充:命名空间 二.模板语言 1.母版继承 2.include 3.自定义simple_tag 三.Cookie Cookie 使用总结 四.视图 1.获取用户请求相 ...

  6. base和this的用法

    [意义] this:指当前类,this调用当前类的属性,方法,包括构造函数的方法,继承本类的构造函数 base:指当前类的父类,可调用父类的非私有属性,方法,继承父类的构造函数括号里的参数 [用处] ...

  7. Python3 与 C# 面向对象之~继承与多态

      2.继承¶ 代码裤子:https://github.com/lotapp/BaseCode 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/mast ...

  8. C++中的继承(1) 继承方式

    1.继承与派生  继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单 ...

  9. 【C++ Primer | 15】继承的构造函数

    继承的构造函数 子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递.如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数. cl ...

随机推荐

  1. androidSD卡操作

    1.获取SD卡目录:File file = Environment.getExternalStorageDirectory(); 2.获取SD卡路径:String path = Environment ...

  2. Django2文档-入门概览

    Django 概览 Django 是设计是为了使通用的Web开发任务变得快速而又简单, 一下是如何使用Django编写数据库驱动的Web应用程序的非正式概述. 这个文档的目标是给你足够的技术细节来理解 ...

  3. Io 异常: The Network Adapter could not establish the connection

    新接触一个项目,导入源码,在本地启动的时候后台报了一个错误: Could not discover the dialect to use. java.sql.SQLException: Io 异常: ...

  4. csv文件转json

    http://stackoverflow.com/questions/19766266/directly-convert-csv-file-to-json-file-using-the-jackson ...

  5. 阿里云EMR集群初始化后的开发准备工作

              前言:EMR的集群使用越来越普遍,但是每一次的集群释放到集群的重新创建,期间总有一些反复的工作需要查询与配置.为方便后续工作查阅,现在对集群初始化后的工作进行大概的梳理如下.   ...

  6. mybatis高级映射(一对一,一对多)

    mybatis高级映射 一对一关联映射 需求:查询订单信息,关联查询用户信息(一个订单对应一个用户) (1)通过resultType实现 sql语句: select orders.* , USER.u ...

  7. Geohash-》基本使用

    我把类文件放到了以上这个路径,在要使用的文件引入使用. 以下是测试代码, 1.先实例化类 2.再调用函数 3.这个函数返回GeoHash编码

  8. ubuntu16.04+eigen3安装

    Eigen库安装指南(两种方式)1.apt-get方式(假设默认安装到/usr/local/include里,若实际中默认安装到了/usr/include的话,可以对应替换下面命令的相应部分);运行命 ...

  9. (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  10. Memory Map

    计算机最重要的功能单元之一是Memory.Memory是众多存储单元的集合,为了使CPU准确地找到存储有某个信息的存储单元,必须为这些单元分配一个相互区别的“身份证号”,这个“身份证号”就是地址编码. ...