Teilweise Abstrakte Klasse
-
Gibt es eine Möglichkeit in C++ eine Teilabstrakte Klasse zu erzeugen.
Die Idee ist folgende: Ich möchte bei der Ableitung einer Abstracte Klasse den Programmierer dazu zwingen gewisse Funktionalität zu programmieren möchte jedoch gewissie Funktionalität bereits implementiert haben.
Bsp[syntatisch nich 100% richtig]
CAbstrakt{
CAbstrakt::CAbstrakt() { Close(); };
CAbstrakt::~CAbstrakt();Init(){ TRACE(EineImplemneierung dass für alle Abgelitenen Klassen gilt)};
Open() = 0;
Close() = 0;
}CAbgeleitet : CAbstrakt
{
Open();
Close();
}[Implementierung der CAbgeleitet Open und Close Funktion]
-
Äh.
Ja.
Mit den nötigen Syntax-Korrekturen sollte das (fast) genau so funktionieren.fast: Du kannst im Konstruktor bzw. Destruktor der abstrakten Basisklasse keine abstrakten ("virtual pure") Methoden verwenden.
Das "Close();" im Konstruktor (BTW: sollte das nicht eher in den Destruktor?) geht also nicht.
Sollte aber auch wurscht sein. Die abgeleitete Klasse muss sowieso sicherstellen dass sie "ihr Zeug" im Destruktor (EDIT: in ihrem eigenen Destruktor) selbst wegmacht.Ich würde dir aber empfehlen von Open/Close Abstand zu nehmen.
Objekte die in einem "konstruiert aber nicht vollständig initialisiert" Zustand sein können sind generell keine gute Idee.
Man braucht an 100 Stellen innerhalb der Klasse Abfragen alaif (!IsOpen()) throw std::logic_error("not open");
.
Und ausserhalb, wo man die Klasse verwenden möchte, muss man auch dauernd mit dem Fall rechnen dass man so einen "konstruiert aber nicht vollständig initialisiert" Zombie übergeben bekommen hat.
=>
Konstruktur initialisiert vollständig. Bei Fehler wirft er Exception.
Dadurch kann es niemals Objekte geben die nicht 100% initialisiert sind.
Destruktor räumt auf.
Der Destruktor der Basisklasse räumt dabei das auf was der Basisklasse gehört und der Destruktor der abgeleiteten Klasse räumt das auf was der abgeleiteten Klasse gehört.Und das was einer Klasse gehört sollte niemals mehr als genau eine Resource sein. Wenn man mehr braucht hat man die Sache einfach nicht fein genug zerlegt. => Resourcenverwalter Hilfsklassen für jeden Resourcen Typ schreiben und diese dann als Member in der ehemals "viele Dinge besitzenden" Klasse verwenden.