1

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

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

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

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

4

4 回答 4

8

您可以通过使用显式接口实现语法删除访问限定符并将接口名称添加到方法的前缀)来实现接口方法,而无需使其成为类的直接公共接口的一部分:

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() { ... }
}
于 2009-12-26T16:21:36.700 回答
2

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

这是该主题的MSDN 讨论,可能会有所帮助。

于 2009-12-26T16:18:16.567 回答
1
class NewClass : IMessage
{
    #region IMessage Members

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

这提供了一个内部实现,仅可用于该程序集中的类,以及一个允许您满足接口要求的显式接口实现。对于来自外部程序集的代码来调用该Check方法,它需要IMessage对您的类的引用,而不是NewClass引用。

于 2009-12-26T16:20:30.057 回答
1

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

public abstract class Message
{
    internal abstract bool Check();
}

public class MyMessage : Message
{
    internal override bool Check()
    {
        // do stuff
    }
}
于 2009-12-26T16:25:22.823 回答