none
请教各位一个C#问题,刚开始学习不好意思啊!问题有点简单 RRS feed

  • 问题

  • 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 参数,它的值是通过basei)这个值传递给myderivedclass(int I,int j)这个构造函数,所以应使用mybaseclass(int i),这样将不调用mybaseclass()构造函数,而是执行以上时间序列。

     

    以上的解释很难理解,各位高手有没有比较简单易懂的解释?

    先谢谢啦!

    2011年6月4日 16:04

答案

  • 简单的说。如果有

    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
    2011年6月6日 7:32

全部回复

  • 简单的说。如果有

    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
    2011年6月6日 7:32
  • 谢谢啦 !刚学问题很多!

    2011年6月7日 9:37
  • 其实不用记忆的这么麻烦。在所有OO语言中,构造的顺序都是从最基类开始,在最外层继承类结束;而对象析构的时候,这个顺序正好相反。

    一个简单的验证办法就是在每一层类的构造函数和析构函数中写Log,然后看一下执行后Log的顺序就非常清楚了。

    以上问题在很多软件公司的面试题中都可以看到。一定要记牢哦! Good Luck


    信奎爷,无所畏惧!!
    2011年6月9日 1:37