Wenn wir davon ausgehen, dass es nicht wünschenswert ist, dass die Basisklasse eine reine Schnittstellenklasse ist, und die beiden folgenden Beispiele verwenden, was ist ein besserer Ansatz unter Verwendung der abstrakten oder virtuellen Methodenklassendefinition?
Der Vorteil der "abstrakten" Version besteht darin, dass sie wahrscheinlich sauberer aussieht und die abgeleitete Klasse zu einer hoffentlich sinnvollen Implementierung zwingt.
Der Vorteil der "virtuellen" Version besteht darin, dass sie leicht von anderen Modulen abgerufen und zum Testen verwendet werden kann, ohne dass eine Reihe von zugrunde liegenden Frameworks hinzugefügt werden müssen, wie es die abstrakte Version erfordert.
Abstrakte Version:
public abstract class AbstractVersion
{
public abstract ReturnType Method1();
public abstract ReturnType Method2();
.
.
public abstract ReturnType MethodN();
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
Virtuelle Version:
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
? Ernsthaft? Wenn Sie nicht unimplemented Typ zum Zeitpunkt der Kompilierung ablehnen können (Sie können, verwenden abstrakte Methoden) zumindest werfen eine Ausnahme.