接口问题

时间:2009-12-26 16:13:49

标签: c# interface public internal

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

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

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

一切都很好。问题是我不希望这个方法(Check())是公共的,我想把它保持在asssembly的内部,但如果我把它作为内部,那么编译器说它没有实现接口。它需要公开才能实现接口。我该怎么办?

4 个答案:

答案 0 :(得分: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() { ... }
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

class NewClass : IMessage
{
    #region IMessage Members

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

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

答案 3 :(得分:1)

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

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

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