我有一个带有输入法的“工人”课程
internal void Run()
{
//do stuff...
}
我有一个用于测试的子类(“TestWorker:Worker”),带有一个入口方法
internal void Run(object aParam)
{
//do something with aParam, then..
Run();
}
我有一个测试应用程序,它在新线程中启动TestWorker实例,
Worker worker;
Thread workerThread;
...
worker = new TestWorker();
workerThread = new Thread(new ParameterizedThreadStart(worker.Run));
workerThread.Start("something");
这将无法编译,编译器报告无法找到参数化委托(在我的子类中)。 我可以通过在Worker类中声明一个虚拟的虚拟运行(对象)方法来解决这个问题,这样我的TestWorker.Run(对象)会覆盖它,但是恕我直言,这是一个不优雅的解决方案,为什么我必须这样做?它是编译器的特质,还是我在逻辑上做错了?
答案 0 :(得分:5)
问题是worker
的编译时类型只是Worker
- 并且不是接受参数的Worker.Run
方法。< / p>
这与代表本身无关 - 你将无法调用
worker.Run("foo");
任一。解决此问题的最简单方法是将worker
的声明更改为TestWorker
。或者,使用单独的局部变量:
TestWorker testWorker = new TestWorker();
workerThread = new Thread(new ParameterizedThreadStart(testWorker.Run));
worker = testWorker;