Pergunta

Vamos dizer que eu tenho o seguinte código:

interface ISomeInterface
{
    void DoSomething();
    void A();
    void B();    
}

public abstract class ASomeAbstractImpl : ISomeInterface
{
    public abstract void A();
    public abstract void B();
    public void DoSomething()
    {
        // code here
    }
}

public class SomeImpl : ASomeAbstractImpl 
{
    public override void A()
    {
        // code
    }

    public override void B()
    {
        // code
    }
}

O problema é que eu gostaria de ter o método ASomeAbstractImpl.DoSomething() selada (final) para que nenhuma outra classe poderia implementá-lo. Como o código é agora SomeImpl poderia ter um método chamado DoSomething() e que poderia ser chamado (que não iria substituir o método com o mesmo nome da classe abstrata, porque isso não está marcado como virtual), mas eu gostaria de cortar a possibilidade de implementação de um tal método na classe SomeImpl.

Isso é possível?

Foi útil?

Solução

Os métodos em C # são selados por padrão. Há, no entanto, nada que possa fazer para evitar método de ocultação (expondo um método com o mesmo nome na classe derivada, comumente com new).

Ou, para essa matéria, interface de reimplementação:

static void Main()
{
    ISomeInterface si = new EvilClass();
    si.DoSomething(); // mwahahah
}

public class EvilClass : ASomeAbstractImpl, ISomeInterface
{
    public override void A() {}
    public override void B() { }
    void ISomeInterface.DoSomething()
    {
        Console.WriteLine("mwahahah");            
    }
}

Outras dicas

Todos os métodos são selados por padrão, mas não há nenhuma maneira de prevenir escondendo-Membro.

O compilador C # emitirá um aviso do compilador quando você esconde um membro, mas fora isso, você não pode impedi-lo.

Um método que não está marcado como virtual é selada por padrão. Em uma classe derivada tem de marcar um método "substituir" com a palavra chave new , então você vai receber um aviso do compilador. Se o método da super classe é marcado como virtual, você pode selá-lo por override selada .

http://msdn.microsoft.com/ en-us / library / aa645769 (VS.71) .aspx

Se classe SomeImpl contém método DoSemthing, isso significa que ele esconde o original não substituir.

Ao lidar com interfaces e classes abstratas sua mais sobre o que você deve fazer e não o que você não pode fazer. Então você pode deixar o know user interface que estes são os métodos que devem ser implementados e com seus classes abstratas você pode usar o virtual palavra-chave para que eles saibam seu OK para substituir um método. No entanto, você não pode impedi-los de fazer muito. Mesmo se você propositadamente não use o virtual Palavra-chave que ainda pode escondê-lo com o new palavra-chave.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top