一个类继承自另外一个类,他们的构造函数改怎么办?

首先必须先声明:构造函数是不能继承的

我们先看一段代码:第一段代码没有构造函数,第二段有一个,第三段有两个。从他们的MSIL可以看出,有几个构造函数就有几个.ctor的il函数。

即使你没有构造函数,编译器也会调用一个空的构造函数。让我们仔细瞧瞧MSIL代码:

我们可以看到每个IL中都有   instance void [mscorlib]System.Object::.ctor()

由此我们可以得出。不管你有几个构造器,你都必须执行父类的构造函数,才能执行当前构造函数;同样对于继承,必须先实现父类的构造函数,才能执行自己的.ctor

如果我们写一个空的构造函数 public class  someType{  public someType(){   }  }

就是public class  someType{  public someType():base(){   }  }  。这种方法是调用(基)类中其他的构造器

(方法一,二 都只有一个.ctor)(方法三:有两个.ctor)

  static void Main(string[] args)
{
Console.WriteLine("nihao");
}

.method public hidebysig specialname rtspecialname
        instance void  .ctor() cil managed
{
  // 代码大小       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ret
} // end of method Program::.ctor

  

 class Program
{
private Int32 i;
public Program(Int32 i)
{
this.i = i;
}
static void Main(string[] args)
{
Console.WriteLine("nihao");
}
}

.method public hidebysig specialname rtspecialname
        instance void  .ctor(int32 i) cil managed
{
  // 代码大小       17 (0x11)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  nop
  IL_0007:  nop
  IL_0008:  ldarg.0
  IL_0009:  ldarg.1
  IL_000a:  stfld      int32 MSIL.Program::i
  IL_000f:  nop
  IL_0010:  ret
} // end of method Program::.ctor

  

class Program
{
private Int32 i;
private Int32 j;
public Program(Int32 i)
{
this.i = i;
}
public Program(Int32 i, Int32 j)
{
this.i = i;
this.j = j;
}
static void Main(string[] args)
{
Console.WriteLine("nihao");
}
} .method public hidebysig specialname rtspecialname
instance void .ctor(int32 i,
int32 j) cil managed
{
// 代码大小 24 (0x18)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfld int32 MSIL.Program::i
IL_000f: ldarg.0
IL_0010: ldarg.2
IL_0011: stfld int32 MSIL.Program::j
IL_0016: nop
IL_0017: ret
} // end of method Program::.ctor .method public hidebysig specialname rtspecialname
instance void .ctor(int32 i) cil managed
{
// 代码大小 17 (0x11)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: nop
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfld int32 MSIL.Program::i
IL_000f: nop
IL_0010: ret
} // end of method Program::.ctor

首先我们看看一个关于this()/base() 也就是本构造器调用其他构造器的例子,注意调用其他构造器在前,再执行自己的代码

 class Program
{
private Int32 i;
private Int32 j;
private string m; public Program() //初始化所有变量
{
this.i = 1;
this.j = 2;
this.m = "nimei";
} public Program(Int32 i):this() //构造单个变量
{
this.i = i;
}
public Program(Int32 j): this()
{
this.i = j;
}
public Program(string m): this()
{
this.m = m;
}
static void Main(string[] args)
{
Console.WriteLine("nihao");
}
}

  三、接下来贴出搞了我一下午的一个例子。在上篇博客中讲到用范型实现一个链表。但是那种实现方式中,链表的每个值必须都是同一个类型,本例中实现任意类型

直接贴代码,下面解释

   public class baseNode {
protected baseNode bNode;
public baseNode(baseNode bn)
{
this.bNode = bn;
}
}
public class Node2<T>:baseNode
{ private T _data; public Node2(T data):this(data,null) //:base(null) 注意在构造之前要实现父类的构造函数
{
this._data = data;
}
public Node2(T data,baseNode bNode):base(bNode)
{
this._data = data;
}
public override string ToString()
{
return _data.ToString() + (bNode != null ? bNode.ToString() : null);
} } public class LeaderFunction2
{
public void function()
{ baseNode node = new Node2<char>('A');
node = new Node2<string>("B", node);
node = new Node2<Int32>(3354435, node);
node = new Node2<char>('D', node);
node = new Node2<char>('E', node); Console.WriteLine(node.ToString());
Console.ReadKey();
} }

 这个例子理解了一下午,搞不懂其内部机制,想用MSIL解释,看到那些伪汇编头都大,主要是由于自己的基础知识不扎实啊!

本例中:第一,注意继承要实现父类的构造

第二,为什么这样写可以实现:

其实还是和之前的一样,虽然到了最后node指向最后一个 NOde2对象,但是之前的对象都没有销毁,地址保存在下个node2中的basenode.bNodeN中。

C#中继承和构造函数的更多相关文章

  1. javascript中继承(二)-----借用构造函数继承的个人理解

    本人目录如下: 零.寒暄&回顾 一,借用构造函数 二.事件代理 三,call和apply的用法 四.总结 零.寒暄&回顾 上次博客跟大家分享了自己对原型链继承的理解,想看的同学欢迎猛击 ...

  2. java中继承,子类是否继承父类的构造函数

    java中继承,子类是否继承父类的构造函数 java继承中子类是不会继承父类的构造函数的,只是必须调用(隐式或者显式) 下面来看例子: public class TestExtends { publi ...

  3. JAVA继承时构造函数的问题

    今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...

  4. 三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解

    在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承.构造函数以及静态代码块的执行顺序. 首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下: 声明类Person,包含2个成员变量:n ...

  5. C++中 类的构造函数理解(一)

    C++中 类的构造函数理解(一) 写在前面 这段时间完成三个方面的事情: 1.继续巩固基础知识(主要是C++ 方面的知识) 2.尝试实现一个iOS的app,通过完成app,学习iOS开发中要用到的知识 ...

  6. 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

    一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类 ...

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

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

  8. JavaScript中继承的那些事

    引言 JS是一门面向对象的语言,但是在JS中没有引入类的概念,之前特别疑惑在JS中继承的机制到底是怎样的,一直学了JS的继承这块后才恍然大悟,遂记之. 假如现在有一个“人类”的构造函数: functi ...

  9. java构造函数使用方法总结 (继承与构造函数)

    使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...

随机推荐

  1. Php处理时间的函数

    1,字符串与时间: 例如 $time = strtotime("2007-3-5"); echo date("Y-m-d H:i:s",$time); 2,当前 ...

  2. HDU1257题解

    解题思路:这题的本质就是:求一个给定的数字序列中,非递增(或非递减)子序列的最少的条数. 思维误区:本题很容易被样例坑,以为是直接求跳跃点(i < j && ai < aj ...

  3. 02_java之数据类型和基本运算

    01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器,例如水杯是容器,用来装载水:你家里的大衣柜是容器,用来装载衣裤:饭盒是容器,用来装载 ...

  4. "网页安全政策"(Content Security Policy,缩写 CSP)的来历

    作者:阿里聚安全链接:https://www.zhihu.com/question/21979782/answer/122682029来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. Python实践练习:多重剪贴板

    题目 假定你有一个无聊的任务,要填充一个网页或软件中的许多表格,其中包含一些文本字段.剪贴板让你不必一次又一次输入同样的文本,但剪贴板上一次只有一个内容.如果你有几段不同的文本需要拷贝粘贴,就不得不一 ...

  6. C#如何消除绘制图形缩放时抖动,总结

    一.手动双缓冲 首先定义一个BitmapBitmap backBuffer = new Bitmap(画布宽度, 画布高度);然后获取这个Bitmap的GraphicsGraphics graphic ...

  7. python操作docx文档(转)

    python操作docx文档 关于python操作docx格式文档,我用到了两个python包,一个便是python-docx包,另一个便是python-docx-template;,同时我也用到了很 ...

  8. SpringBoot入门之spring-boot-maven-plugin

    spring-boot-maven-plugin插件是将springboot的应用程序打包成fat jar的插件.首先我们说一下啥叫fat jar.fat jar 我们暂且叫他胖jar吧,实在是找不到 ...

  9. MySQL批量添加表字段

    ALTER TABLE custom ADD contacts2 VARCHAR(50) NOT NULL DEFAULT '' COMMENT '客户联系人2',ADD phone2 VARCHAR ...

  10. 领域Command

    一.项目结构 二.代码 /// <summary> /// /// </summary> public interface ICommand { } /// <summa ...