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

本文关键字:构造函数 函数调用 | 更新日期: 2023-09-27 18:36:20

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

此调用机制是否是最佳做法?

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

根据设计,基类应该封装所有派生类通用的功能(因为它将被它们继承)。如果通过基类构造函数初始化的字段/属性与所有派生类的初始化相关,那么是的,通过 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"; }
    }
} 

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

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

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

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

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

: base()

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

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