C # herança
-
06-07-2019 - |
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?
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.