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

时间:2014-03-25 16:17:52

标签: c# .net 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)' 
    }   

但正如你所看到的,它无法编译。我无法想象为什么,只要SomeJob实现了IJob接口 编译器真的不应该关心吗?

4 个答案:

答案 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);