我不明白为什么不允许这样做

本文关键字:不允许 这样做 为什么 明白 | 更新日期: 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);   
相关文章: