如何在子进程完全初始化后在基类中执行方法?

问题描述 投票:1回答:3

我实现了以下结构:

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的另一个子类,他有可能忘记调用该方法。我的问题是基类中是否有更通用的解决方案,以确保在子进程完全初始化后执行该方法。

c# .net constructor abstract-class
3个回答
2
投票

答案是不。

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

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


2
投票

这是不可能的,因为构造函数初始化程序不能以这种方式工作。相反,您可以选择将一些参数传递给基础构造函数,这些参数可能特定于您的子类

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

1
投票

在调用基类的构造函数之前,不能直接“插入”方法调用,因为它在未初始化的对象上调用方法。但是您可以使用模板方法模式:

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
© www.soinside.com 2019 - 2024. All rights reserved.