我实现了以下结构:
public abstract class A
{
protected A()
{
Test();
}
private void Test()
{
Console.WriteLine("2");
}
}
public class B : A
{
public B() : base()
{
Console.WriteLine("1");
}
}
当我创建类B
的实例时,方法Test()
在构造函数调用类B
之前执行。在我的情况下,此方法应在子进程完全初始化后运行。使其工作的一种可能方法是使Test()
可以从B
访问,并在其构造函数的末尾调用它。这可行,但如果有人创建A
的另一个子类,他有可能忘记调用该方法。我的问题是基类中是否有更通用的解决方案,以确保在子进程完全初始化后执行该方法。
答案是不。
.NET或C#中没有任何内容可以确保在所有后代构造函数执行后调用方法。
一种不同的方法是工厂模式的某种形式,您的类基本上只为您提供另一个已正确设置的实例,并调用所有必需的方法。
这是不可能的,因为构造函数初始化程序不能以这种方式工作。相反,您可以选择将一些参数传递给基础构造函数,这些参数可能特定于您的子类
public abstract class A
{
protected A(string data)
{
Test(data);
}
private void Test(string data)
{
Console.WriteLine(data);
}
}
public class B : A
{
public B() : base("1")
{
//some other initialization logic here
}
}
在调用基类的构造函数之前,不能直接“插入”方法调用,因为它在未初始化的对象上调用方法。但是您可以使用模板方法模式:
abstract class A {
protected A () {
BeforeTest ();
Test ();
}
protected abstract void BeforeTest ();
private void Test () {
Console.WriteLine ("2");
}
}
class B : A {
protected override void BeforeTest () {
Console.WriteLine ("1");
}
}
internal class Program {
public static void Main (string [] args) {
new B ();
}
}
或者,您可以将Test
方法设为虚拟:
abstract class A {
protected A () {
Test ();
}
protected virtual void Test () {
Console.WriteLine ("2");
}
}
class B : A {
protected override void Test () {
Console.WriteLine ("1");
base.Test ();
}
}
internal class Program {
public static void Main (string [] args) {
new B ();
}
}
两个示例都输出相同的结果:
1
2