[英]Problem with Interfaces
我有一個接口(稱為IMessage),它具有方法Check(),一個類實現了此接口
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
#region IMessage Members
public bool Check()
{
//Some logic
}
}
一切都很好。 問題是我不希望此方法(Check())是公共的,我想將其保留在程序集的內部,但是如果我將其設置為內部,則編譯器會說它不實現該接口。 實現該接口需要公開。 我能做什么?
您可以通過使用顯式接口實現語法 ( 刪除訪問限定符並將接口名稱作為方法的前綴)來實現接口方法,而無需使其成為類的直接公共接口的一部分:
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() { ... }
}
接口都是關於其他對象如何以公共方式與該類型的對象進行接口的。 如果其他類不應訪問Check()
方法,則該類不應成為接口的一部分。
這是有關此主題的MSDN討論 ,可能會有所幫助。
class NewClass : IMessage
{
#region IMessage Members
internal bool Check()
{
//Some logic
}
bool IMessage.Check()
{
return this.Check();
}
}
這提供了一個內部實現,僅適用於該程序集中的類,另外還提供了一個明確的接口實現 ,使您可以滿足接口的要求。 為了使外部程序集的代碼調用Check
方法,它需要對類的IMessage
引用,而不是NewClass
引用。
另外,您可以在基類上使用抽象方法:
public abstract class Message
{
internal abstract bool Check();
}
public class MyMessage : Message
{
internal override bool Check()
{
// do stuff
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.