代码之家  ›  专栏  ›  技术社区  ›  viky

接口问题

  •  1
  • viky  · 技术社区  · 15 年前

    我有一个接口(称为IMessage),它有一个方法check(),一个类实现了这个接口。

    interface IMessage
    {
        bool Check();
    }
    
    class NewClass : IMessage
    {
        #region IMessage Members
    
        public bool Check()
        {
            //Some logic
        }
    }
    

    一切都很好。问题是我不希望这个方法(check())是公共的,我希望将它保留在组件内部,但是如果我将它设置为内部的,那么编译器说它不实现接口。它需要是公共的来实现接口。我能做什么?

    4 回复  |  直到 15 年前
        1
  •  8
  •   LBushkin    15 年前

    通过使用 显式接口实现语法 ( 移除访问限定符并在方法的接口名称前面加前缀 ):

    interface IMessage
    {
        bool Check();
    }
    
    class NewClass : IMessage
    {
        bool IMessage.Check()  { }
    }
    

    但是,任何可以 IMessage 接口仍然可以调用check()。这不是阻止对方法调用的一种方法,只是清理类的公共接口。如果接口是程序集的内部接口,那么只有该程序集中的类才能强制转换并调用该方法。

    一般来说,.NET不提供仅使接口的某些方法成为接口实现内部方法的方法。这是一个您可能希望考虑抽象基类的领域,您可以在那里创建受保护的抽象方法,继承者可以在不向外部调用程序公开的情况下实现这些方法。例如:

    abstract class MessageBase
    {
        protected abstract bool Check();
    }
    
    class NewClass : MessageBase
    {
        protected override bool Check() { ... }
    }
    
        2
  •  2
  •   Kaleb Brasee    15 年前

    接口都是关于其他对象如何以公共方式与该类型的对象进行交互。如果其他类不应该访问 Check() 方法,那么它不应该是接口的一部分。

    这里有一个 MSDN discussion 这一主题可能会有所帮助。

        3
  •  1
  •   Timothy Carter    15 年前
    class NewClass : IMessage
    {
        #region IMessage Members
    
        internal bool Check()
        {
            //Some logic
        }
        bool IMessage.Check()
        {
            return this.Check();
        }
    }
    

    这提供了一个内部实现,只对该程序集中的类可用,加上 explicit interface implementation 这允许您满足接口的需求。用于从外部程序集调用 Check 方法,它需要 IMessage 提到你的班级,而不是 NewClass 参考文献。

        4
  •  1
  •   Mike Valenty    15 年前

    或者,可以在基类上使用抽象方法:

    public abstract class Message
    {
        internal abstract bool Check();
    }
    
    public class MyMessage : Message
    {
        internal override bool Check()
        {
            // do stuff
        }
    }
    
    推荐文章