Problema com interfaces
Pergunta
Eu tenho uma interface (chame como iMessage) que tem uma verificação de método (), uma classe implementa essa interface
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
#region IMessage Members
public bool Check()
{
//Some logic
}
}
Tudo bem. O problema é que eu não quero que esse método (check ()) seja público, quero mantê -lo interno ao assse -Rembly, mas se eu o tornar interno, o compilador diz que não implementa a interface. Precisa ser público para implementar a interface. O que posso fazer?
Solução
Você pode implementar um método de interface sem fazer parte da interface pública direta da classe usando Sintaxe de implementação de interface explícita ( removendo o qualificador de acesso e prefixo o nome da interface ao método ):
interface IMessage
{
bool Check();
}
class NewClass : IMessage
{
bool IMessage.Check() { }
}
No entanto, qualquer um que possa lançar para o IMessage
A interface ainda pode chamar a verificação (). Essa não é uma maneira de impedir uma chamada para o método - apenas a organização da interface pública da classe. Se a interface for interna à sua montagem, apenas as classes nessa montagem poderiam ser lançadas para ela e chamar o método.
Em geral, o .NET não oferece uma maneira de fazer apenas um determinado método de uma interface interna para uma implementação da interface. Esta é uma área em que você pode considerar uma classe base abstrata - lá você pode criar métodos abstratos protegidos que os herdeiros podem implementar sem expô -los a chamadores externos. Por exemplo:
abstract class MessageBase
{
protected abstract bool Check();
}
class NewClass : MessageBase
{
protected override bool Check() { ... }
}
Outras dicas
As interfaces são sobre como outros objetos fazem interface com esse tipo de objeto, de maneira pública. Se outras classes não deveriam acessar o Check()
Método, então isso não deve fazer parte da interface.
Aqui está um Discussão do MSDN deste tópico que pode ser útil.
class NewClass : IMessage
{
#region IMessage Members
internal bool Check()
{
//Some logic
}
bool IMessage.Check()
{
return this.Check();
}
}
Isso fornece uma implementação interna, disponível apenas para classes dentro dessa montagem, além de um Implementação explícita de interface Isso permite que você atenda aos requisitos da interface. Para o código de uma assembléia externa para ligar para o Check
método, exigiria um IMessage
referência à sua classe, não um NewClass
referência.
Como alternativa, você pode usar um método abstrato em uma classe base:
public abstract class Message
{
internal abstract bool Check();
}
public class MyMessage : Message
{
internal override bool Check()
{
// do stuff
}
}