从子构造函数调用基础构造函数

时间:2012-06-04 05:46:22

标签: c# inheritance abstract-class

从子构造函数调用基础构造函数是最佳做法吗?这里的基数是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()
    {

    }
} 

这种呼叫机制是最佳做法吗?

5 个答案:

答案 0 :(得分: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"; }
    }
} 

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在执行类自己的构造函数之前,将始终调用类的基础构造函数。 “:base( value )”语法只是一种向其传递参数的方法,如果你想调用默认构造函数,你不必编写“:base()”它将被调用反正。

答案 3 :(得分:0)

由于只有一个构造函数为基类定义,因此来调用它。

如果有多个已定义,您可以选择要呼叫的那个。

如果基类具有默认构造函数,则忽略显式调用它。例如

: base()

不是必需的。然而,这并不意味着它不仅仅被称为编译器发出调用而不必明确地声明它

答案 4 :(得分:0)

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