我不明白为什么不允许这样做
本文关键字:不允许 这样做 为什么 明白 | 更新日期: 2023-09-27 17:53:01
希望你能帮助理解这一点,这样做似乎很自然:
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接口
两个问题
首先,c#区分大小写。您将方法定义为StartJob
(大写S),但实现startJob
(小写S)。
第二,你的方法接受实现IJob
的SomeJob。但是你的界面上说这个方法应该能够吸收IJob
。也就是说,任何实现接口的类,不限于SomeJob
。
想象一下,如果您有另一个实现IJob
的类:
public class FooJob : IJob
{
// Whatever...
}
然后创建一个SomeJobManager
的实例,如下所示:
IJobManager manager = new SomeJobManager();
现在,当你像这样调用StartJob
:
manager.StartJob(new FooJob());
你认为会发生什么?你的SomeJobManager
需要一个SomeJob
实例,但是接口说它必须是一个IJob
。
如果你的代码是允许的,你就打破了接口承诺的契约,即StartJob
可以被任何IJob
调用。你在你的实现中说,它必须至少是一个SomeJob
,这是不一样的。
你的接口说"任何实现我的类必须实现一个StartJob
方法,该方法可以接受任何实现IJob的类。"
你的实现是说"我的StartJob方法只适用于一个SomeJob,我不知道如何处理IJob的其他实现。"
你的实现比接口有更多的限制,因此编译器不会承认你的实现已经满足了接口的要求。
您正在传递IJob
的具体实现给该方法,但它需要IJob
的实例。
只做:
public class SomeJobManager : IJobManager
{
public void StartJob(IJob job) { }
}
当你调用StartJob
:
SomeJob
//Something like this...
var myJob = new SomeJob();
manager.StartJob(myJob);