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

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

我们先看一段代码:第一段代码没有构造函数,第二段有一个,第三段有两个。从他们的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. Java Thread 多线程同步、锁、通信

    参看:http://www.cnblogs.com/hoojo/archive/2011/05/05/2038101.html

  2. Drools简单例子

    转自:http://www.blogjava.net/diggbag/articles/359347.html 1.Drools简单例子 首先是搭建一个可供进行Drools开发的框架.Jboss官方推 ...

  3. python开发_python中for循环操作

    如果你对python中的for循环不是很清楚,请看看这篇文章:”for循环控制语句——菜鸟的Python笔记“ 下面是我做的一些学习记录供大家参考: #基本的for循环语句 test_list = [ ...

  4. 读《分布式一致性原理》JAVA客户端API操作3

    更新数据 客户端可以通过zookeeper的API来更新一个节点的数据内容,有如下两个接口: public Stat setData(final String path, byte data[], i ...

  5. asp.net(c#)GridView实现鼠标悬停高亮显示

    搜索了一下,发现对于这种基本都使用girdview中的RowDataBound事件完成,下面看看网上提供的简单方法protected void GridView1_RowDataBound(objec ...

  6. c# typeof 与 Type.GetType 使用与效率对比

    static void ReflectionTest() {//测试两种反射的效率问题 //Type.GetType()只能在同一个程序集中使用,typeof则可以跨程序集(assembly) //通 ...

  7. shell 中可以for 循环的时间加减日期格式

    ..};do # LAST_HOUR=`date -d '-${num} hour' +%H` 不可for循环,报格式错误 LAST_HOUR=`date "+%H" -d -${ ...

  8. MySQL用变量的方法添加伪序号列(自增序列)

    在进行数据筛选时,可能会用到给每一条数据配上一个唯一的序号,便于进行定位. 方法: 序号的设置:   @rownum :=@rownum + 1 AS rownum 获取序号的伪表[必须]:   (S ...

  9. failed to open stream: No such file or directory 报错解决方法

    1.首先检查是否是文件名错误(比如有空格):是否因为路径不完整(比如缺少http://,或者缺少文件扩展名.doc等): 2.若是在本地中文名文件打开报错,我就是因为编码不一致导致: Windows中 ...

  10. AspectJ的aop编程--切入点表达式