我有一个接口(称为IMessage),它有一个方法Check(),一个类实现了这个接口
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
#region IMessage Members
public bool Check()
{
//Some logic
}
}
一切都很好。问题是我不希望这个方法(Check())是公共的,我想把它保持在asssembly的内部,但如果我把它作为内部,那么编译器说它没有实现接口。它需要公开才能实现接口。我该怎么办?
答案 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
}
}