如何在 C# 中将 Method/ThreadStart 传递给基本构造函数

问题描述 投票:0回答:2

我目前正在使用一个名为 Engine 的类,该类旨在在其构造函数中接受 ThreadStart 委托。这是 Engine 类的简化版本:

public class Engine {
    public Engine(ThreadStart threadStart) {
        // Initialization logic here...
    }
}

我的目标是用另一个名为 UpdateEngine 的类来扩展这个类。与 Engine 不同,UpdateEngine 并不在其构造函数中直接采用 ThreadStart。相反,它有一个名为 UpdateRun 的方法,我希望将其作为 ThreadStart 传递给 Engine 的构造函数,如下所示:

public class UpdateEngine : Engine {
    public UpdateEngine() : base(UpdateRun) {
        // Additional initialization logic here...
    }

    public void UpdateRun() {
        // Method implementation...
    }
} 

但是,当我尝试执行此操作时,遇到编译器错误:CS0120 非静态字段、方法或属性需要对象引用。

我知道有多种方法可以解决方法继承和重写(例如,使用 virtualoverrideabstractstatic),但我很好奇是否有办法使用它来实现我的目标具体方法。

我还尝试在 Engine 类中引入委托类型(例如 CallBack)并将其用作构造函数的参数,但这也没有成功。

有人对如何实现这一目标有见解或建议吗?任何指导或替代方法将不胜感激!

c# multithreading inheritance
2个回答
1
投票

除非

public void UpdateRun()
static
,否则无法完成此操作,这违背了目的。

发生这种情况是因为基类构造函数在当前类的构造函数执行之前被调用,这意味着在调用基类构造函数时,没有

this

 指针,因此您无法访问属于当前实例的任何内容。 

所有面向对象语言都会遇到这个障碍(它不是 C++ 所特有的),并且没有解决方案:您必须重新安排类的结构才能克服它。


0
投票
正如 Mike Nakis 所说,你不能在施工期间这样做。您可以添加一个必须在构造后直接调用的

virtual Init()

 方法。它很笨重,但会起作用。 
Init()
 然后会在你的 Engine 类中设置你的线程。

© www.soinside.com 2019 - 2024. All rights reserved.