我目前正在使用一个名为Engine的类,它被设计为在其构造函数中接受ThreadStart委托.以下是Engine级课程的简化版本:

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

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

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

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

然而,当我try 这样做时,我遇到了一个编译器错误:CS0120 An object reference is required for the non-static field, method, or property.

我知道有各种方法来处理方法继承和重写(例如,使用virtualoverrideabstractstatic),但我很好奇是否有办法使用这种特定的方法来实现我的目标.

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

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

推荐答案

这是不可能做到的,除非public void UpdateRun()static,这是一种失败的目的.

这是因为基类构造函数是在当前类的构造函数执行之前调用的,这意味着在调用基类构造函数时没有this指针,因此您无法访问属于当前实例的任何内容.

在所有面向对象的语言中都会遇到这个问题(它不是C++所特有的),而且它没有解决方案:您必须重新安排类的 struct 才能通过它.

Csharp相关问答推荐

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

使用其可能实现的基类和接口的属性的方法

在依赖性注入和继承之间进行 Select

LINQ无法翻译SQLFunctions方法

`Task`只有在C#中等待时才会运行吗?

在具有主构造函数的类中初始化属性时出现警告

模型绑定RazorPage表单

如何将MongoDB序列化程序设置为内部对象属性

BlockingCollection T引发意外InvalidOperationException

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

ASP.NET Core MVC将值从视图传递到控制器时出现问题

EF Core:如何对关系属性进行建模?

C#如何获取字符串中引号之间的文本?

工厂类是如何在.NET 8中注册的?

Azure队列触发器未使用隔离的工作进程执行

使用Try-Catch-Finally为API端点处理代码--有什么缺点?

如何根据分割文本的块数来计算文本的大小?

如果图表S批注包含使用LINQ的具有特定名称的批注,我如何签入C#

我是否以错误的方式使用了异步延迟初始化?

使用生产环境调试我的应用程序的快速方法