【问题标题】:Problem with Interfaces接口问题
【发布时间】:2010-12-30 03:19:41
【问题描述】:

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

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

    public bool Check()
    {
        //Some logic
    }
}

一切都好。问题是我不希望这个方法(Check())公开,我想将它保留在程序集内部,但是如果我将它设为内部,那么编译器会说它没有实现接口。它需要公开才能实现接口。我能做什么?

【问题讨论】:

  • 我的第一个问题是......有什么意义?
  • 我不希望它可以从程序集外部访问,因此我希望将其保持为内部不公开。

标签: c# interface public internal


【解决方案1】:

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

这是此主题的MSDN discussion,可能会有所帮助。

【讨论】:

  • 我想将 Check() 方法声明为内部不公开。
  • 这实际上取决于 IMessage 的可见性。此外,明确的接口实现正是针对这种情况的。不过,您是对的 - 该方法仍然可以通过 IMessage 访问。
【解决方案2】:
class NewClass : IMessage
{
    #region IMessage Members

    internal bool Check()
    {
        //Some logic
    }
    bool IMessage.Check()
    {
        return this.Check();
    }
}

这提供了一个内部实现,仅适用于该程序集中的类,加上一个explicit interface implementation,可让您满足接口的要求。对于来自外部程序集的代码调用 Check 方法,它需要对您的类的 IMessage 引用,而不是 NewClass 引用。

【讨论】:

    【解决方案3】:

    您可以通过使用显式接口实现语法删除访问限定符并将接口名称作为方法的前缀 em>):

    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() { ... }
    }
    

    【讨论】:

    • +1 表示抽象基类建议,这似乎更像他正在寻找的。​​span>
    • 但是接口是内部的,所以程序集外的调用者不能使用它。
    • @erikkallen:是的——我在回复的第二段最后一句中提到了这一点。如果接口在程序集内部,则只有该程序集中的代码才能调用该方法。这就是显式接口实现可以帮助您向外部调用者隐藏方法的地方。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多