如何在 child 完全初始化后执行基 class 中的方法?

How to execute a method in base class after child is fully initialized?

我实现了以下结构:

public abstract class A
{
    protected A()
    {
        Test();
    }

    private void Test()
    {
        Console.WriteLine("2");
    }
}

public class B : A
{
    public B() : base()
    {
        Console.WriteLine("1");
    }
}

当我创建 class B 的实例时,方法 Test() 在构造函数调用 class B 之前执行。在我的例子中,这个方法应该在 child 完全初始化之后 运行。使其工作的一种可能方法是使 Test() 可从 B 访问并在其构造函数的末尾调用它。那会起作用,但是如果有人创建了 A 的另一个 subclass ,他有可能忘记调用该方法。我的问题是在基础class中是否有更通用的解决方案来确保该方法在child完全初始化后执行。

答案是否定的

.NET 或 C# 中没有内置任何东西可以确保所有后代构造函数都已执行后调用方法。

另一种方法是某种形式的工厂模式,您的 class 基本上只是为您提供另一个已正确设置的实例,并调用所有必需的方法。

这无法完成,因为构造函数初始值设定项不能那样工作。相反,您可以选择将一些参数传递给基本构造函数,这些参数可能特定于您的 child class,例如

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
    }
}

您不能在调用基础 class 的构造函数之前直接 "insert" 方法调用,因为它是在未初始化的对象上调用方法。但是你可以使用模板方法模式:

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