在后代类中,有没有办法同时调用public,参数化构造函数以及protected / private构造函数,同时仍然调用基类的构造函数?
例如,给出以下代码:
using System;
public class Test
{
void Main()
{
var b = new B(1);
}
class A
{
protected A()
{
Console.WriteLine("A()");
}
public A(int val)
: this()
{
Console.WriteLine("A({0})", val);
}
}
class B : A
{
protected B()
{
Console.WriteLine("B()");
}
public B(int val)
: base(val)
{
Console.WriteLine("B({0})", val);
}
}
}
给出的输出是:
A()
A(1)
B(1)
然而,这正是我所期待的:
A()
B()
A(1)
B(1)
有没有办法通过构造函数链来实现这一点?或者我应该在OnInitialize()
中使用A
类型的方法,它是抽象的还是虚拟的,在B
中被覆盖并从A
的受保护的无参数构造函数调用?
答案 0 :(得分:1)
不,只有构造函数才能实现您所需要的功能。你本质上是要求构造函数链“分支”,这是不可能的;每个构造函数可以在当前类或父类中调用一个(并且只有一个)构造函数。
实现此目的的唯一方法是(如您所建议的)通过使用您在基类中调用的虚拟初始化函数。通常,在构造函数中调用虚拟成员是不受欢迎的,因为您可以使子类中的代码在其构造函数之前执行,但鉴于这正是您所追求的,这是您唯一真正的方法。