Eu sei que há dúvidas sobre como chamar o método base dentro de um método sobrescrito como isto . Mas e se um método substituído apenas chamar a classe base? Isso é mau / bom se dignar? Parece estranho, por que substituir um método apenas para chamar a base de qualquer maneira?
Por exemplo, consulte:
public class BaseClass { virtual public void Method1() { //Do stuff } } public class InheritingClass : BaseClass { override public void Method1() { base.Method1(); } }
Comentários
- Não serve para nada e apenas confunde o código, então livre-se dele.
- @DavidArno that ' foi o que eu pensei também, apenas para ter certeza de que não havia ' um motivo para isso antes de fazer isso
- Em um mundo ideal, o aplicativo será coberto por testes de unidade, portanto, você poderia removê-lo e, quando todos os testes ainda fossem aprovados, você ' saberia que não era ' necessário. Nós não ' nem sempre vivemos nesse mundo ideal, então foi sensato perguntar 🙂
- A única razão pela qual eu ' d deixaria o código com a aparência anterior, se houvesse mais código no método substituído no passado, mas poderia ser visualizado em versões antigas no sistema de controle de origem. Deixar um artefato no código atual como este pode indicar ao desenvolvedor hoje para ver o histórico do arquivo ' s para a versão anterior do método.
Resposta
Mas e se um método substituído chamar apenas a classe base? Este é um design ruim / bom?
Design ruim ? Não, implementação bastante ruim. É enganoso para o programador de manutenção. Quando não vejo uma substituição, então sei que a base é chamada. Uma substituição me diz que há algo diferente, mesmo se a base for chamada lá também.
Requerer uma substituição para chamar a base sem um modelo é um projeto ruim
Tópico referenciado – resposta mais popular
Minha reação inicial à substituição escandinava o modelo é: CODING HORROR! Parece que sou forçado a ler tudo isso, e muito mais, para ter certeza de que o “subcomportamento” não quebra meu código e vice-versa.
O Template Method Pattern é uma boa maneira de expressar o código variável dentro de algum fluxo de código maior e garantir a ordem de execução correta.
Na minha experiência, é típico para uma subclasse ter que saber quais métodos declarados de base chamar e em ordem. Pegue um punhado de subclasses, todas com a mesma estrutura de controle cut-n-paste, acrescente 5 anos de manutenção; agora você entende por que prefiro 101 provas Wild Turkey .
P.S. Tudo isso é um grande motivo pelo qual eu protesto contra o uso excessivo de interface
s em vez de abstract
classes.
Comentários
- O uso excessivo de interfaces em C # provavelmente vem do fato de não querermos atrelar o implementador a essa classe base abstrata específica. Usar uma interface permite que o implementador implemente outra classe base, e não apenas aquela classe abstrata específica. No entanto, depende muito das circunstâncias. Acho que uma boa prática é ter uma interface
IFoo
e uma classeFooBase
, que implementa aIFoo
interface, com chamadas de método abstratas para os métodos e propriedades automáticas para os adereços. Talvez inclua um ctor também.
Resposta
IMO, virtual
, na classe base, têm uma implementação muito básica. Mesmo se override
a definição de virtual
método na classe filha, ainda podemos chamar o virtual
método (com implementação básica) embora faça sentido e não afete o comportamento pretendido do método overridden
na classe filha.
Por exemplo, BaseCalculator faz o trabalho real. A Calculadora está decorando a biblioteca BaseCalculator, estendendo-a.
public class BaseCalculator { public virtual T Add<T>(T number01, T number02) { return number01 + number02; } } public class Calculator: BaseCalculator { public override T Add<T>(T number01, T number02) { Console.WriteLine(number01 + " | " + number02); var result = base.Add<int>(1, 3); Console.WriteLine("Result: "+ result); return result; } }
P: E se um método substituído chamar apenas a classe base?
A: No seu caso, tendo o método de classe base como virtual
, não precisamos override
até que queiramos mudar seu comportamento.
P: Isso é ruim / bom condizer?
A: Sim, pode ter um design ruim, pois pode bagunçar o arquivo de código-fonte enquanto adicionamos substituições desnecessárias.
P: Parece estranho, por que substituir um método apenas para chamar a base?
A: BaseCalculator faz o trabalho real . A Calculadora está decorando a biblioteca BaseCalculator, estendendo-a.
Espero que ajude!