C#中的泛型类继承问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 03:27:18
有如下程序:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication5
{
class Program
{
class Class1<Y>
{

public Class1()
{
Console.WriteLine("一");
}
}
class Class2<Y>:Class1<Y>
{
public Class2()
{

Console.WriteLine("二");
}
}
static void Main(string[] args)
{
Class1<int> mm=new Class1<int>();
Class2<double> nn = new Class2<double>();
}
}
}
为什么答案输出是:一


为什么有两个一呢?为什么实例化派生类对象的时候还会调用继承类的构造函数呢? 这中间是个怎么样的过程啊?

这和泛型无关的
派生类的构造函数隐式调用基类的构造函数.在继承中,所有基类构造函数先于派生类构造函数获得调用,并按照这些类在类层次结构中出现的先后顺序调用

给段介绍:
5.3 派生类中的构造函数
派生类中的对象既包含从基类继承而来的域,也包含了局部定义的域。为了构造一个派生类的对象,我们必须对所有这些域加以正确的初始化。派生类的构造函数可以用来初始化变量,但基类必须知道如何正确初始化其域,保证约定不被破坏。因此,继承类的构造函数必须通过显式或者隐式地调用基类的构造函数,委托构造为被继承状态。

构造函数不是方法,也不可继承。如果基类中定义了一系列构造函数,并且某个派生类又想拥有同样形式的构造函数,那么派生类就必须显式地对某个构造函数进行声明,即使这个构造函数所做的全部工作就是调用一下同样形式的基类构造函数。

在为类创建对象时,将会对它所有的域分配内存,包括从基类继承来的域。这些域会被设置为相应类型的默认初始值。然后,就会调用构造函数。执行每个构造函数包括3个阶段:

l 调用基类的构造函数。

l 利用初始化语句块对域进行初始化。

l 执行构造函数体。

首先,执行显式或者隐式的基类构造函数调用。如果使用了显示的this构造函数调用,那么这种调用链将会一直执行到遇到某个显式或者隐式的基类构造函数调用为止,然后这个基类构造函数就会被调用。基类构造函数的执行也要经过相同的3个阶段——这将会被递归地加以应用,直到达到Object构造函数,因为此时再也找不到基类构造函数了。作为显式构造函数调用一部分的任何表达式都不允许引用当前对象的成员。

接着,所有的域初始化语句块将会按照声明的顺序依次执行。此时,允许引用当前对象的其他成员,条件是它们已经被声明过。

最后,构造函数体的实际语句将会被执行。如果构造函数是被显式调用的,那么结束时,控制权将会转移到调用它的那个构造函数手中,并接着执行它的其余部分。

构造派生类的时候会先构造基类,基类都不存在哪来的派生类,这是子类类型可以向基类转化的基础

<