簡體   English   中英

接口問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM