-3

从子构造函数调用基本构造函数是最佳实践吗?这里的基地是一个abstract class

这是示例代码

abstract class MyBase
{
    String l_strChildName;
    public MyBase(String Name)
    {
        l_strChildName = Name;
    }

    public abstract void func();
}

class MyChild_One : MyBase
{
    public MyChild_One() : base("MyChild One") { }

    public override void func()
    {

    }
}

class MyChild_Two : MyBase
{
    public MyChild_Two() : base("MyChild Two") { }

    public override void func()
    {

    }
} 

这种调用机制是最佳实践吗?

4

5 回答 5

2

根据设计,基类应该封装所有派生类共有的功能(因为它会被它们继承)。如果您通过基类构造函数初始化的字段/属性与所有派生类的初始化相关,那么是的,通过base关键字将其传递给基类构造函数是正确的方法。

在您的情况下,由于基类是抽象的,并且它的唯一构造函数需要一个参数,因此使用base关键字实际上是强制性的;没有其他方法可以从类层次结构中初始化实例。

我假设您提供的示例是为了这个问题而设计的。你不应该编码一个类名;您可以使用GetType方法(或is关键字)在运行时识别实例的实际类型:

MyBase x = new MyChild_One();
Console.WriteLine(x.GetType().Name);   // Outputs "MyChild_One" 

对于值永远不会改变的字段/属性,您还可以使用被所有派生类覆盖的抽象只读属性:

abstract class MyBase
{
    public abstract String l_strChildName { get; }
}

class MyChild_One : MyBase
{
    public override String l_strChildName 
    { 
        get { return "MyChild One"; }
    }
}

class MyChild_Two : MyBase
{
    public override String l_strChildName 
    { 
        get { return "MyChild Two"; }
    }
} 
于 2012-06-04T05:51:23.197 回答
1

您的基类构造函数需要一个参数,而子类不需要,所以我看不出在这种情况下如何避免调用基类构造函数 - 这是必需的

于 2012-06-04T05:53:41.030 回答
1

类的基构造函数总是在类自己的构造函数执行之前被调用。":base( value )" 语法只是向它传递参数的一种方式,如果你想调用默认构造函数,你不必编写 ":base()" 它无论如何都会被调用。

于 2012-06-04T05:57:13.480 回答
0

是的,它很好,如果派生类需要相同的基类构造函数。最好使用base
关键字来调用基类构造函数。

于 2012-06-04T06:01:03.017 回答
0

因为只有一个构造函数为基类定义,所以必须调用它。

如果有多个定义,您可以选择调用哪一个。

如果基类有一个默认构造函数,你可以省略显式调用它。例如。

: base()

不需要。然而,这并不意味着它不仅被调用,编译器发出调用,而您不必显式声明它

于 2012-06-04T05:57:12.670 回答