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

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. 我是如何确认线上CLOSE_WAIT产生的原因及如何解决的。

    1.阐述 内部架构:Tomcat应用程序---> nginx ---> 其他Tomcat应用程序,内部Tomcat应用通过nginx调用其他应用. HTTP插件:HttpClient 4. ...

  2. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  3. lambda表达式不使用委托(delegate) 用FUNC

    lLambda不使用delegate关键字,而使用  Lambda运算符 => goes to l    1.Func<int,string> getInput = (int age ...

  4. 学习时用的软件最新 开发环境为Visual Studio 2010,数据库为SQLServer2005,使用.net 4.0开发。 超市管理系统

    一.源码特点 1.采用典型的三层架构进行开发.模板分离,支持生成静态 伪静态..购物车.登陆验证.div+css.js等技术二.功能介绍 1.本源码是一个超市在线购物商城源码,该网上商城是给超市便利店 ...

  5. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

  6. Building an MFC project for a non-Unicode character set is deprecated

    1>------ 已启动生成: 项目: TestSdk, 配置: Debug Win32 ------1>C:\Program Files (x86)\MSBuild\Microsoft. ...

  7. Head First设计模式之抽象工厂模式

    一.定义 给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:     1)系统中有多个产品族,而系统一次只可能消费其中一族产品.      2)同属于同一个 ...

  8. socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放

     socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放 

  9. [js高手之路] html5 canvas教程 - 制作一个数码倒计时效果

    效果图: 这个实例主要注意: 1,剩余时间的计算 2,每个时间数字的绘制 时间主要有0-9和一个冒号组成,用数组来表示( 0: 就是不画圆,1:就是画一个蓝色的圆 ) num.js文件: var di ...

  10. 理解css伪类和伪元素

    伪类就是可以通过直接添加一个类样式达到同等效果,而伪元素,则需要先添加一个元素,然后在元素上添加样式才能达到同等效果 伪类 :active 向被激活的元素添加样式. :focus 向拥有键盘输入焦点的 ...