Passado cerca de 5 anos (talvez mais, desculpem se me enganei) de ver os meus mentores do .NET a estudar dedicada e afincadamente (como nunca vi ninguém) a plataforma .NET, eis que os vejo embasbacados com algo que desconheciam. Passo a explicar no contexto da linguagem C#:
- Imaginem uma interface I que especifica um método m(). O método m() no âmbito da interface I é virtual.
- Uma classe A implementa I e define o método m(). O método m() continua a ser virtual, independentemente de se indicar virtual explicitamente na declaração do método .
- Uma classe B estende a classe A e quer redefinir o método m(). Bhaaa.... Aqui embasbacamos. O compilador reclama que este método não é virtual, logo não pode ser redefinido (override). porquê?
Vamos ver a definição em IL do método m() em A e vemos que ele é virtual. Mas tem lá mais qualquer coisa... final. Isto impede a sua redefinição em B. Correcto.
A mensagem de erro do compilador deixou-nos baralhados, por dizer que o método m() não é virtual. Quando sabíamos que ele teria que ser obrigatoriamente virtual, por ser especificado por uma interface.
Só quando indicamos explicitamente virtual na definição de m() na classe A é que este não é final. Mas porque é que a linguagem C# obriga a isto?
A mim só me causa transtorno. Cada vez que quero implementar uma interface da plataforma .NET, não posso aproveitar parte da implementação de uma classe, porque também não consigo redefinir os métodos que quero.