Zitat Zitat von dml Beitrag anzeigen
Ich bin bei Version 0.4.1.2 von dem Ableiten von Klassen wieder weggegangen, da ich Glaubte für einen Drittten, der nur schnell Mal seine eigene Maske erstellen will, ist es so leichter.
Beide Ansätze haben ihre Vor- und Nachteile.

EIne komplexe Ableitungshierachie kann schwer zu verstehen sein, oder sogar falsch verstanden werden. In deinem Fall ist das aber sehr überschaubar.

Auf der anderen Seite kann die Notwendigkeit, gemeinsamen Code zu kopieren auch schlecht sein. Zum Beispiel wird dann vielleicht Code kopiert und eingesetzt, der zwar scheinbar funnktioniert aber ungeahnte Nebeneffekte hat.

Oder wenn Fehler in solchen Codesegmenten gefunden werden, müssen sie in allen Kopien ebenfalls gefunden und behoben werden.

Eine dritte Möglichkeit ist, gemeinsamen Code unabhängig von Vererbung auszulagern und dann Aufrufe zu delegieren.

Nehmen wir als Beispiel BookMask::fill(). Dort hast du im Wesentlichen zwei Arten von Funktionalität:
* extrahieren aus dem Dateiinhalt
* Füllen von Widgets

In einer der Varianten habe ich einzelne Kombinationen davon in protected Methoden der Basisklasse ausgelagert, z.B. getColor().

Diese Methode würde dabei sowohl das Extrahieren der Farbe, als auch das Setzen am ColorListEditor machen.

Wir könnten das aber auch anders trennen, also z.B. so
Code:
class CommonDataParser
{
public:
    explicit CommonDataParser(QString file_content) : file_content(file_content) {}

    QString getVersion() const;
    QColor getColor() const;

private:
    const QString file_content;
};

QString CommonDataParser::getVersion() const
{
    static QRegExp exp(".*<version>(.*)</version>.*");
  		if (exp.exactMatch(file_content)){
			     return exp.cap(1); 
		  }
    return QString();
}

QColor CommonDataParser::getColor() const
{
    static QRegExp exp(".*body. color: (#......); background-color: #......;.*");

    QColor color;
  		if (exp.exactMatch(file_content))
			     color.setNamedColor(exp.cap(1));

    if (!color.isValid())
        color = Qt::black;

    return color;
}
BookMask::fill() kann dann einfach ein Objekt davon erzeugen und benutzen

Code:
void BookMask::fill(QString file_content, QFileInfo fileinfo)
{
    CommonContentParser parser(file_content);

    version = parser.getVersion();
    color_cmb->setColor(parser.getColor());
}
Das lässt sich natürlich auch mit Ableitungen von Mask oder Document kombinieren.

Einer der Vorteile dieser Auslagerung ist, dass man die ausgelagerte Funktionalität leichter testen kann, z.B. in automatischen Unittests mittels QTestLib.

Ciao,
_