希望你能帮助理解这一点,这样做似乎很自然:
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)'
}
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的,它不会编译.我无法想象为什么,..只要SomeJob实现IJob接口,编译器就不应该真正关心?
两个问题.
首先,C#区分大小写.您将方法定义为StartJob(大写S),但实现startJob(小写s).
其次,你的方法接受SomeJob实现IJob.但是你的界面说该方法应该能够接受IJob.也就是说,任何实现接口的类,不仅限于SomeJob.
想象一下,如果你有另一个实现的类IJob:
public class FooJob : IJob
{
// Whatever...
}
Run Code Online (Sandbox Code Playgroud)
然后你创建一个这样的实例SomeJobManager:
IJobManager manager = new SomeJobManager();
Run Code Online (Sandbox Code Playgroud)
现在,当你这样打电话时StartJob:
manager.StartJob(new FooJob());
Run Code Online (Sandbox Code Playgroud)
你期望发生什么?你SomeJobManager期望一个SomeJob实例,但界面说如果必须是一个IJob.
如果您的代码被允许,那么您已经破坏了接口所承诺的合同,这StartJob可以通过任何可以调用的合同来调用IJob.你在实现中已经说过它必须至少是一个SomeJob,这是不一样的.
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |