希望你能帮助理解这一点,这样做似乎很自然:
public interface IJob
{
bool started { get; set; }
}
public interface IJobManager
{
void StartJob(IJob job);
}
public class SomeJob : IJob
{
public bool started { get; set; }
public void OnlySomeJobDoesThis();
}
public class SomeJobManager : IJobManager
{
public void startJob(SomeJob job) { } // --> Error'SomeJobManager' does not implement interface member 'IJobManager.StartJob(IJob)'
}
但正如你所看到的,它无法编译。我无法想象为什么,只要SomeJob实现了IJob接口 编译器真的不应该关心吗?
答案 0 :(得分:9)
两个问题。
首先,C#区分大小写。您将方法定义为StartJob
(大写S),但实现startJob
(小写s)。
其次,您的方法接受实现IJob
的SomeJob。但是您的界面说该方法应该能够接收IJob
。也就是说,任何实现接口的类,不仅限于SomeJob
。
答案 1 :(得分:5)
想象一下,如果你有另一个实现IJob
的类:
public class FooJob : IJob
{
// Whatever...
}
您可以像这样创建SomeJobManager
的实例:
IJobManager manager = new SomeJobManager();
现在,当您像这样致电StartJob
时:
manager.StartJob(new FooJob());
您期望发生什么?您的SomeJobManager
需要一个SomeJob
个实例,但界面会说如果必须是IJob
。
如果您的代码被允许,则您违反了接口所承诺的合同,这可以使用StartJob
的任何内容调用IJob
。你在实现中已经说过它必须至少是SomeJob
,这是不一样的。
答案 2 :(得分:3)
您的界面说“任何实现我的类都必须实现StartJob
方法,该方法可以任何实现IJob 的类。”
您的实现是说“我的StartJob方法仅适用于 a SomeJob ,我不知道如何处理IJob的其他实现。”
您的实现比接口更具限制性,因此编译器不承认您的实现已满足接口要求。
答案 3 :(得分:2)
您正在将IJob
的具体实现传递给该方法,但它需要一个IJob
的实例。
只是做:
public class SomeJobManager : IJobManager
{
public void StartJob(IJob job) { }
}
然后在致电SomeJob
时传递StartJob
:
//Something like this...
var myJob = new SomeJob();
manager.StartJob(myJob);