Problema con le interfacce
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?
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
}
}