【问题标题】:Can't figure out why this is not allowed无法弄清楚为什么这是不允许的
【发布时间】:2014-03-25 16:17:52
【问题描述】:

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

    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 接口 编译器真的不需要关心吗?

【问题讨论】:

  • 那么如果我将SomeJobManager 转换为IJobManager 并将我的SomeOtherJob : IJob 传递给startJob,会发生什么?
  • C# 区分大小写。 startJobStartJob 不同。如果您确实需要将其命名为小写,请显式实现接口。
  • 旁白:命名约定有助于避免大小写问题,并有助于训练眼睛发现问题。以下是 C# 命名约定和建议的精彩总结:10rem.net/articles/…

标签: c# .net interface


【解决方案1】:

两个问题。

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

其次,您的方法采用 SomeJob 实现IJob。但是您的界面显示该方法应该能够接收IJob。也就是说,任何实现接口的类,不仅限于SomeJob

【讨论】:

    【解决方案2】:

    想象一下,如果您有另一个实现 IJob 的类:

    public class FooJob : IJob
    {
      // Whatever...
    }
    

    然后您像这样创建SomeJobManager 的实例:

    IJobManager manager = new SomeJobManager();
    

    现在,当您像这样拨打StartJob 时:

    manager.StartJob(new FooJob());
    

    您希望发生什么?您的 SomeJobManager 需要一个 SomeJob 实例,但界面显示 if 必须是 IJob

    如果您的代码被允许,您将违反接口承诺的约定,即可以使用任何 IJob 来调用 StartJob。你在你的实现中说过它必须至少是一个SomeJob,这是不一样的。

    【讨论】:

      【解决方案3】:

      您的界面在说“任何实现我的类都必须实现StartJob 方法,该方法可以采用任何实现 IJob 的类。”

      您的实现说“我的 StartJob 方法仅适用于 SomeJob,我不知道如何处理 IJob 的其他实现。”

      您的实现比接口更具限制性,因此编译器不会承认您的实现已满足接口要求。

      【讨论】:

        【解决方案4】:

        您将IJob 的具体实现传递给该方法,但它需要IJob 的实例。

        只要做:

         public class SomeJobManager : IJobManager
        {
            public void StartJob(IJob job) { } 
        }
        

        然后在调用StartJob时传入SomeJob

        //Something like this...
        var myJob = new SomeJob();
        manager.StartJob(myJob);   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多