从子构造函数调用基础构造函数是最佳做法吗?这里的基数是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()
{
}
}
这种呼叫机制是最佳做法吗?
答案 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
用于调用基类构造函数的关键字。