无法弄清楚为什么不允许这样做

doe*_*oet 0 .net c# interface

希望你能帮助理解这一点,这样做似乎很自然:

    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接口,编译器就不应该真正关心?

Bra*_*don 9

两个问题.

首先,C#区分大小写.您将方法定义为StartJob(大写S),但实现startJob(小写s).

其次,你的方法接受SomeJob实现IJob.但是你的界面说该方法应该能够接受IJob.也就是说,任何实现接口的类,不仅限于SomeJob.


Sea*_*ean 5

想象一下,如果你有另一个实现的类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,这是不一样的.