Möglichkeit,Diamantvererbung zu umgehen,um Signal zu nutzen?
Verfasst: 24. Juni 2009 09:23
Hallo,
folgendes Szenario (vereinfachter Code):
Es gibt Klassen (hier OwnButton, OwnLineEdit), die von tpyischen grafischen Objektklassen (hier QPushButton, QLineEdit) abgeleitet sind, um diese spezifisch zu erweitern.
Nun ist es so, dass diese Klassen zu ihrer Erweiterung einige Gemeinsamkeiten haben, die in eine abstrakte Oberklasse (hier OwnObject) ausgelagert werden, damit diese nicht in jeder Klasse implementiert werden müssen. Bis hier ist noch kein Problem.
Nun gehen wir mal von aus, es wird ein gemeinsames Signal oder Slot für die "Own-Klassen" benötigt, was dann nach obriger Struktur in die "OwnObject" Klasse implementiert werden müsste:
(vereinfachter Code):
Nur müsste ja an dieser Stelle die Klasse "OwnObject" nun auch von QObject abgeleitet werden und das Q_OBJECT Marco verpasst bekommen.
Dann kommst ja zur Diamantvererbung, da ja auch QPushButton, QLineEdit,... auch von QObject abgeleitet sind.
Man könnte sowas nun durch "virtuelles Ableiten" gelöst bekommen, aber es ist immer die Frage, ob das das "Gelbe vom Ei" ist und nicht später für böse Überraschungen sorgt.
Ich weis, dass man zB. mit Q_INVOKABLE FUnktionen den MOCompiler bekannt machen kann, die keine Slots sind (Gebrauch zB bei QScript).
Ein Kollege meint mal gehört zu haben, dass man Signale auch ohne QObject Klassenableitung definieren und nutzen kann. Er ist sich aber nicht sicher.
Im Assistent steht auch was von Q_SIGNAL(S), Q_SLOT(S), die ja für 3rd party signal/slot Mechanismen gedacht sind.
Kennt jemand eine solche Problemstellung und hat jemand einen guten Lösungsvorschlag, Tipp?
Vielen Dank
folgendes Szenario (vereinfachter Code):
Code: Alles auswählen
class OwnObject
class OwnButton : public OwnObject, public QPushButton
class OwnLineEdit : public OwnObject, public QLineEditNun ist es so, dass diese Klassen zu ihrer Erweiterung einige Gemeinsamkeiten haben, die in eine abstrakte Oberklasse (hier OwnObject) ausgelagert werden, damit diese nicht in jeder Klasse implementiert werden müssen. Bis hier ist noch kein Problem.
Nun gehen wir mal von aus, es wird ein gemeinsames Signal oder Slot für die "Own-Klassen" benötigt, was dann nach obriger Struktur in die "OwnObject" Klasse implementiert werden müsste:
(vereinfachter Code):
Code: Alles auswählen
class OwnObject
{
...
signals:
void ownSignal();
};
class OwnButton : public OwnObject, public QPushButton
class OwnLineEdit : public OwnObject, public QLineEditDann kommst ja zur Diamantvererbung, da ja auch QPushButton, QLineEdit,... auch von QObject abgeleitet sind.
Man könnte sowas nun durch "virtuelles Ableiten" gelöst bekommen, aber es ist immer die Frage, ob das das "Gelbe vom Ei" ist und nicht später für böse Überraschungen sorgt.
Ich weis, dass man zB. mit Q_INVOKABLE FUnktionen den MOCompiler bekannt machen kann, die keine Slots sind (Gebrauch zB bei QScript).
Ein Kollege meint mal gehört zu haben, dass man Signale auch ohne QObject Klassenableitung definieren und nutzen kann. Er ist sich aber nicht sicher.
Im Assistent steht auch was von Q_SIGNAL(S), Q_SLOT(S), die ja für 3rd party signal/slot Mechanismen gedacht sind.
Kennt jemand eine solche Problemstellung und hat jemand einen guten Lösungsvorschlag, Tipp?
Vielen Dank