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

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

我们先看一段代码:第一段代码没有构造函数,第二段有一个,第三段有两个。从他们的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. MySql——进阶一(库表的建 删 改)

    基于学生管理系统建立 数据库 和 表 表的样式: 表(一)Student (学生use) 属性名 数据类型 可否为空 含 义 Sno varchar (20) 否 学号(主码) Sname varch ...

  2. HBase快速上手

    一.创建单节点HBase实例 https://hbase.apache.org/book.html#quickstart (一)jdk版本要求Java: HBase Version JDK 7 JDK ...

  3. SVN 提交、更新、解决冲突等操作步骤

    1. 纳入版本控制 ①新建文件abc.txt ②在文件上点右键 ③添加后文件图标发生变化 2. 提交 ①使用TortoiseSVN可以提交具体某一个文件,或某一个目录下的所有改变.方法就是在想要提交的 ...

  4. 数据分析之Numpy-数组计算

    引言 : 数据分析 : 就是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出研究对象的内在规律 . 数据分析三剑客 : Numpy   数组计算    Pandas   表计算与数据分析   ...

  5. linux系统构架 - LB集群之LVS的NAT

    1.环境说明 三台服务器,一台叫dir,两台叫rs1和rs2 (director 和 real server) dir外网ip:192.168.192.129  内网ip:192.168.1.114 ...

  6. Git(四):Git远程操作详解

    转: http://www.ruanyifeng.com/blog/2014/06/git_remote.html Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多 ...

  7. jbpm角色审批

    可分配是一个部门或角色组,也可以选择一个表达式操作,提交任务时可以根据权限过滤这个部门或组的用户中选择一个可操作用户 <task name="审核">          ...

  8. 1.Hadoop集群搭建之Linux主机环境准备

    Hadoop集群搭建之Linux主机环境 创建虚拟机包含1个主节点master,2个从节点slave1,slave2 虚拟机网络连接模式为host-only(非虚拟机环境可跳过) 集群规划如下表: 主 ...

  9. flask 常见关系模板代码

    以下罗列了使用关系型数据库中常见关系定义模板代码 一对多示例场景:用户与其发布的帖子(用户表与帖子表)角色与所属于该角色的用户(角色表与多用户表)示例代码class Role(db.Model): & ...

  10. MySQL内置功能之事务、函数和流程控制

    主要内容: 一.事务 二.函数 三.流程控制 1️⃣  事务 一.何谓事务? 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. # ...