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?

Foi útil?

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
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top