Se assumirmos que não é desejável que a classe base seja uma classe de interface pura, e usando os 2 exemplos abaixo, qual é a melhor abordagem, usando a definição de classe de método abstrato ou virtual?
A vantagem da versão "abstrata" é que ela provavelmente parece mais limpa e força a classe derivada a fornecer uma implementação esperançosamente significativa.
A vantagem da versão "virtual" é que ela pode ser facilmente acessada por outros módulos e usada para teste sem adicionar um monte de estrutura subjacente, como a versão abstrata exige.
Versão abstrata:
public abstract class AbstractVersion
{
public abstract ReturnType Method1();
public abstract ReturnType Method2();
.
.
public abstract ReturnType MethodN();
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
Versão virtual:
public class VirtualVersion
{
public virtual ReturnType Method1()
{
return ReturnType.NotImplemented;
}
public virtual ReturnType Method2()
{
return ReturnType.NotImplemented;
}
.
.
public virtual ReturnType MethodN()
{
return ReturnType.NotImplemented;
}
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
return ReturnType.NotImplemented
? Seriamente? Se você não pode rejeitar o tipo não implementado em tempo de compilação (você pode; usar métodos abstratos) pelo menos lance uma exceção.