Jeśli założymy, że nie jest pożądane, aby klasa podstawowa była czystą klasą interfejsu i przy użyciu 2 poniższych przykładów, co jest lepszym podejściem przy użyciu abstrakcyjnej lub wirtualnej definicji klasy metody?
Zaletą „abstrakcyjnej” wersji jest to, że prawdopodobnie wygląda ona na czystszą i zmusza klasę pochodną do podania, miejmy nadzieję, znaczącej implementacji.
Zaletą wersji „wirtualnej” jest to, że można ją łatwo pobrać z innych modułów i wykorzystać do testowania bez dodawania zestawu podstawowych struktur, jakich wymaga wersja abstrakcyjna.
Wersja abstrakcyjna:
public abstract class AbstractVersion
{
public abstract ReturnType Method1();
public abstract ReturnType Method2();
.
.
public abstract ReturnType MethodN();
//////////////////////////////////////////////
// Other class implementation stuff is here
//////////////////////////////////////////////
}
Wersja wirtualna:
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? Poważnie? Jeśli nie możesz odrzucić niezaimplementowanego typu w czasie kompilacji (możesz; użyj metod abstrakcyjnych), przynajmniej rzuć wyjątek.