Si nous supposons qu'il n'est pas souhaitable que la classe de base soit une classe d'interface pure, et en utilisant les 2 exemples ci-dessous, quelle est la meilleure approche, en utilisant la définition de classe de méthode abstraite ou virtuelle?
L'avantage de la version "abstraite" est qu'elle est probablement plus propre et force la classe dérivée à donner une implémentation, espérons-le, significative.
L'avantage de la version "virtuelle" est qu'elle peut être facilement tirée par d'autres modules et utilisée pour les tests sans ajouter un tas de framework sous-jacent comme la version abstraite l'exige.
Version abstraite:
public abstract class AbstractVersion
{
public abstract ReturnType Method1();
public abstract ReturnType Method2();
.
.
public abstract ReturnType MethodN();
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
Version virtuelle:
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
? Sérieusement? Si vous ne pouvez pas rejeter le type non implémenté au moment de la compilation (vous pouvez; utiliser des méthodes abstraites) au moins lever une exception.