从子构造函数调用基构造函数
本文关键字:构造函数 函数调用 | 更新日期: 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()
不是必需的。然而,这并不意味着它不仅仅是编译器发出调用而不必明确声明它。
是的,如果派生类需要相同的基类构造函数,那很好。 最好使用基地
用于调用基类构造函数的关键字。