Domanda

Ho un'interfaccia (chiamare come iMessage), che ha un metodo Check (), una classe implementa questa interfaccia

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

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

Che tutto bene. Il problema è che non voglio che questo metodo (Check ()) per essere pubblico, voglio tenerlo interno al asssembly, ma se i renderlo interna allora compilatore dice che non implementa l'interfaccia. Ha bisogno di essere pubblico per implementare l'interfaccia. Cosa posso fare?

È stato utile?

Soluzione

È possibile implementare un metodo di interfaccia senza farne parte dell'interfaccia pubblica diretta della classe utilizzando implementazione dell'interfaccia esplicita sintassi ( rimuovere il qualificatore di accesso e anteporre il nome dell'interfaccia al metodo ):

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    bool IMessage.Check()  { }
}

Tuttavia, chiunque può lanciare l'interfaccia IMessage può ancora chiamare Controllare (). Questo non è un modo di prevenire una chiamata al metodo - solo di decluttering l'interfaccia pubblica della classe. Se l'interfaccia è interno alla vostra assemblea, quindi solo le classi in quella riunione potrebbe gettare ad esso e chiamare il metodo.

In generale, NET non offre un modo per rendere unico metodo certo di un'interfaccia interna per un'implementazione dell'interfaccia. Questo è un settore in cui si può prendere in considerazione una classe base astratta - non è possibile creare metodi astratti protetti quali eredi possono implementare senza esporli a chiamanti esterni. Ad esempio:

abstract class MessageBase
{
    protected abstract bool Check();
}

class NewClass : MessageBase
{
    protected override bool Check() { ... }
}

Altri suggerimenti

Le interfacce sono tutto su come l'altra interfaccia oggetti con quel tipo di oggetto, in modo pubblico. Se altre classi non dovrebbero accedere al metodo Check(), allora questo non dovrebbe essere parte dell'interfaccia.

Ecco un discussione MSDN di questo tema che può essere utile.

class NewClass : IMessage
{
    #region IMessage Members

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

Questo fornisce un'implementazione interna, disponibili solo per le classi all'interno di tale complesso, più un interfaccia esplicita implementazione che consente di soddisfare i requisiti dell'interfaccia. Per il codice da un assembly esterno per chiamare il metodo Check, sarebbe necessario un riferimento IMessage alla classe, non un riferimento NewClass.

In alternativa, è possibile utilizzare un metodo astratto su una classe di base:

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

public class MyMessage : Message
{
    internal override bool Check()
    {
        // do stuff
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top