Hallo Forum,
ich schätze, ich habe ein "Verbrechen" mit folgendem Szenario begangen:
- Interface "I_step" definiert
- Eine Basisklasse "Baseclass" erstellt und dort Methoden implementiert,
die ich in jeder späteren Instanz auf jeden Fall haben möchte
- Einige abgeleitete Klassen erstellt, die von Baseclass erben.
Das vermutliche Verbrechen: im Inetrface gibt es eine Funktion, die in
der Basisklasse aufgerufen wird, aber erst in den abgeleiteten Klassen
definiert wird, da zwar der Zeitpunkt des AUfrufs im Programablauf
gleich sein soll, aber das auszuführende unterschiedlich.
Habe ich da Murks gebaut?
Wenn die Basisklasse nicht alle Funktionen vom Interface implementiert
kann man zwar kein Objekt dieser Klasse erstellen, aber ich denke das
ist dir schon aufgefallen. Ansonsten ist das schon in Ordnung.
Sebastian V. schrieb:> Wenn die Basisklasse nicht alle Funktionen vom Interface implementiert> kann man zwar kein Objekt dieser Klasse erstellen, aber ich denke das> ist dir schon aufgefallen. Ansonsten ist das schon in Ordnung.
Dann müsste diese Basisklasse eine rein virtuelle Methode enthalten und
wäre demnach eine abstrakte Basisklasse. Richtig?
Durchstarter schrieb:> Das vermutliche Verbrechen: im Inetrface gibt es eine Funktion, die in> der Basisklasse aufgerufen wird, aber erst in den abgeleiteten Klassen> definiert wird, da zwar der Zeitpunkt des AUfrufs im Programablauf> gleich sein soll, aber das auszuführende unterschiedlich.
Bis auf die Namen ist dass alles ok. Das Muster (Pattern) hat sogar
einen Namen: Strategy Pattern.
:-)
Auf der einen Seite bin ich erleichtert, dass die einhellige Meinung
positiv ist.
Auf der anderen Seite, hatte ich das Gegenteil gehofft, weil sich
beschriebene Methode manchmal merkwürdig verhält.
@Mark,
ja genau, die Basisklasse ist nicht instanziierbar.
Manchmal mehrt sich bei mir der Verdacht, dass man mehr oder weniger
automatisch in Pattern programmiert, wenn man sich vorher ein paar
strukturelle Überlegungen macht??
Torsten R. schrieb:> Das Muster (Pattern) hat sogar einen Namen: Strategy Pattern.
Da die entsprechende(n) Methode(n) in der Basisklasse aufgerufen werden,
bleibe ich bei "Template Method Pattern" oder Schablonenmethode.
Durchstarter schrieb:> Manchmal mehrt sich bei mir der Verdacht, dass man mehr oder weniger> automatisch in Pattern programmiert, wenn man sich vorher ein paar> strukturelle Überlegungen macht??
Ja, und genau das ist die "gute" Vorgehensweise (im Gegensatz zu: Ich
habe hier einen Katalog von 100 Entwurfsmustern; wie verwende ich jetzt
bloß möglichst viele davon).
In diesem Szenario kann man sich aber schon in den Fuß schießen:
einfach in einem Konstruktor der Basisklasse eine virtuelle Methode
aufrufen, die erst in der abgeleiteten Klasse implementiert wird.
Aber in einer hohen Warnstufe sollte mittlerweile jeder Compiler davor
warnen.
Warpkernauswerfer schrieb:> Torsten R. schrieb:>> Das Muster (Pattern) hat sogar einen Namen: Strategy Pattern.>> Da die entsprechende(n) Methode(n) in der Basisklasse aufgerufen werden,> bleibe ich bei "Template Method Pattern" oder Schablonenmethode.
Ja, Du hast Recht! :-)
Georg B. schrieb:> In diesem Szenario kann man sich aber schon in den Fuß schießen:> einfach in einem Konstruktor der Basisklasse eine virtuelle Methode> aufrufen, die erst in der abgeleiteten Klasse implementiert wird.>
Ist das wirklich so?
Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber
die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die
initializer lists schon abgearbeitet), oder?
Vlad T. schrieb:> Georg B. schrieb:>> In diesem Szenario kann man sich aber schon in den Fuß schießen:>> einfach in einem Konstruktor der Basisklasse eine virtuelle Methode>> aufrufen, die erst in der abgeleiteten Klasse implementiert wird.>>>> Ist das wirklich so?
Ja. Eine Instanz einer Klasse C "ist-ein" C erst, wenn der Konstruktor
von C fertig ist, nicht vorher. Wenn eine Klasse D von C abgeleitet ist,
kann der Konstruktor von C keine Methoden von D aufrufen (auch keine
virtuellen), weil zu diesem Zeitpunkt die Instanz noch nicht "ist-ein"
D.
Vlad T. schrieb:> Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber> die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die> initializer lists schon abgearbeitet), oder?
Die V-Table ist zum Zeitpunkt, zu dem der Konstruktor von B abläuft,
noch nicht auf D gesetzt. Auch die Initializer-List von D ist noch nicht
abgearbeitet.
Durchstarter schrieb:> Auf der anderen Seite, hatte ich das Gegenteil gehofft, weil sich> beschriebene Methode manchmal merkwürdig verhält.
Je mehr du über dieses merkwürdiges Verhalten erzählst, desto größer ist
die Chance dass jemand dir damit helfen kann.
Tja, mit einem klarem Kopf am morgen sieht man mehr:
qDebug() << "Bla bla String" + integerMessert;
>so gehts dann magischer weise doch:
qDebug() << "Bla bla String" + QString::number(messWert);
kaum macht man´s richtig, schon funktioniert´s. Immer wieder
erstaunlich...
Durchstarter schrieb:> Tja, mit einem klarem Kopf am morgen sieht man mehr:>> qDebug() << "Bla bla String" + integerMessert;>>so gehts dann magischer weise doch:> qDebug() << "Bla bla String" + QString::number(messWert);>> kaum macht man´s richtig, schon funktioniert´s. Immer wieder> erstaunlich...
Ich bin jetzt nicht so vertraut mit qt, aber
1
qDebug()<<"Bla bla String"<<integerMessert;
sollte bestimmt auch gehen und sieht irgend wie "vertrauter" aus ;-)
Hoppla, war nicht qDebug() sondern
myCursor->insertText("Bla bla String" + QString::number(wert));
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Vlad T. schrieb:> Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber> die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die> initializer lists schon abgearbeitet), oder?
Nein. Erst wenn der Konstruktor der abgeleiteten Klasse vollständig
ausgeführt wurde, kann man davon ausgehen, dass der entsprechende Teil
des Objekts auch vollständig initialisiert ist. Deshalb gilt das Objekt
auch erst ab dem Zeitpunkt als Instanz dieser Klasse.
Bernd K. schrieb:> Kal Auer schrieb:>> [virtual.gif]>> Da lob ich mir Pascal, da dürfen sogar Konstruktoren virtuell sein :-)
Was da in diesem Bild steht, stimmt aber nicht. Virtulle
Memberfunktionen funktionieren auch in Kontruktoren.