积极答复者
请教各位一个C#问题,刚开始学习不好意思啊!问题有点简单

问题
-
Public class mybaseclass
{
Public mybaseclass()
{}
Public mybaseclass(int i)
{}
}
Public class myderivedclass:mybaseclass
{
Public myderivedclass()
{}
Public myderivedclass(int i)
{}
Public myderivedclass(int I,int j):base(i)
{}
}
执行以上代码是否得到以下代码执行顺序?
(1)执行system.object.object()构造函数
(2)执行mybaseclass.mybaseclass(int i)构造函数
(3)执行myderivedclass. Myderivedclass(int I,int j)构造函数
书上给出以下解释:
这个顺序可以把int i参数的代码放在mybaseclass(int i)中,这时Myderivedclass(int I,int j)构造函数只需要处理int j(假定int i参数在两种情况下都相同),只需要使用构造函数的初始化器,在方法定义的冒号后面,指定派生类的构造函数定义中指定所使用的基类构造函数。
Base关键字指定.NET实例化过程使用基类中有指定参数的构造函数 myderivedclass(int I,int j),这里使用了一个inti 参数,它的值是通过base(i)这个值传递给myderivedclass(int I,int j)这个构造函数,所以应使用mybaseclass(int i),这样将不调用mybaseclass()构造函数,而是执行以上时间序列。
以上的解释很难理解,各位高手有没有比较简单易懂的解释?
先谢谢啦!
- 已更改类型 Leo Liu - MSFTModerator 2011年6月8日 4:49 A Question
答案
-
简单的说。如果有
class A { public A() { } }
class B : A { public B() : base() { } }那么 B 的无参构造函数 B() 会调用其基类 A 的构造函数,然后会调用 B 类的默认无参构造函数。
当调用的基类构造函数为无参构造函数时,base 可以省略。比如上例,可以写成 public B() { }。编译器会自动帮助您调用 base()。
但如果调用的基类构造函数包含参数,那么就需要显式指定。如
class A { public A(int i) { } }
class B { public B() : base(-1) { } }注意,您给出的解释有一点问题。使用 base 之后,并不是不调用其自身的构造函数,而是在调用自身定义的构造函数之前,先调用基类的特定的构造函数。
另外,构造函数的调用顺序是从最基本类型,即 System.Object 开始的。比如,new 一个 String,则会调用 Object 上的无参构造函数,以及 String 上的特定构造函数。
Mark Zhou- 已建议为答案 Charles Shao 2011年6月9日 1:33
- 已标记为答案 桂素伟Moderator 2011年6月9日 7:09
全部回复
-
简单的说。如果有
class A { public A() { } }
class B : A { public B() : base() { } }那么 B 的无参构造函数 B() 会调用其基类 A 的构造函数,然后会调用 B 类的默认无参构造函数。
当调用的基类构造函数为无参构造函数时,base 可以省略。比如上例,可以写成 public B() { }。编译器会自动帮助您调用 base()。
但如果调用的基类构造函数包含参数,那么就需要显式指定。如
class A { public A(int i) { } }
class B { public B() : base(-1) { } }注意,您给出的解释有一点问题。使用 base 之后,并不是不调用其自身的构造函数,而是在调用自身定义的构造函数之前,先调用基类的特定的构造函数。
另外,构造函数的调用顺序是从最基本类型,即 System.Object 开始的。比如,new 一个 String,则会调用 Object 上的无参构造函数,以及 String 上的特定构造函数。
Mark Zhou- 已建议为答案 Charles Shao 2011年6月9日 1:33
- 已标记为答案 桂素伟Moderator 2011年6月9日 7:09
-
其实不用记忆的这么麻烦。在所有OO语言中,构造的顺序都是从最基类开始,在最外层继承类结束;而对象析构的时候,这个顺序正好相反。
一个简单的验证办法就是在每一层类的构造函数和析构函数中写Log,然后看一下执行后Log的顺序就非常清楚了。
以上问题在很多软件公司的面试题中都可以看到。一定要记牢哦! Good Luck
信奎爷,无所畏惧!!- 已建议为答案 Charles Shao 2011年6月9日 1:37