Vererbung is doof
Verfasst: Freitag 19. August 2011, 18:48
Hallo,
Ich habe eine Basisklasse Base mit der Basisfunktionalität.
Nun will ich davon Subklassen SubFx haben, die jeweils eine Funktionalität Fx implementieren.
Z.B. SubF1, SubF2, SubF3, ...
Jetzt will ich dass die einzelnen Subklassen auch die jeweils anderen Funktionalitäten haben:
SubF1, SubF1F2, SubF1F2F3 ...
Und danach will ich extensiv in meiner Basisklasse und den Subklassen herumpfuschen ohne andersowo Änderungen machen zu müssen
Decorator ist keine gute Lösung, da ich Methoden nach einer bestimmten Reihenfolge überschreiben muss. Man könnte vllt noch einschränken welche Subklassen des Interfaces man im Konstruktor zulässt. Andererseits will ich kleine Klassen haben und wenn ich Decorator verwende wimmelt es von Funktionen, die nicht direkt mit der Aufgabe der Klasse zusammenhängen.
Es wäre toll wenn es eine Klassen vom Typ ExtendableClass mit folgenden Eigenschaften gäbe:
Ich kann eine neue Klasse Plugin schreiben und sie der ExtendableClass hinzufügen.
Dabei werden alle Methoden die mit @add deklariert sind zur ursprünglichen Klasse hinzugefügt.
Alle Methoden die mit @replace markiert sind ersetzen die vorherige Methode in ExtendableClass.
Alle Methoden die mit @chain versehen sind werden in eine Kette mit der vorherigen Methode in ExtendableClass bzw. mit den vorherigen Methoden gehängt und nacheinander ausgeführt. Dabei kann wie beim Decorator auf den Rückgabewert der vorherigen Methode zugegriffen werden.
Von Plugin aus hat man Zugriff auf alle Attribute des ExtendableClass Objektes und allen anderen Plugins die der Klasse hinzugefügt wurden.
Ich habe versucht das ganze dynamisch zu implementieren was einigermaßen hingehauen hat. Ein statischer Ansatz wäre aber vermutlich schöner und man könnte tatsächlich die Klasse erweitern anstatt das Objekt. Dadurch bräuchte man auch keine umständlichen Methoden mehr, die vorher überprüfen ob das Attribut tatsächlich schon in ExtendableClass vorhanden ist. Man könnte auch noch eine Möglichkeit einbauen Abhängigkeiten zu benötigten Plugins aufzulösen.
So könnte man die verschiedenen Methoden sehr einfach statisch zu der Klasse linken.
Entschuldigt bitte die nicht ganz pythonische Ausdrucksweise.
Was denkt ihr dazu?
[Edit] "Funktionen" durch "Methoden" ersetzt
Ich habe eine Basisklasse Base mit der Basisfunktionalität.
Nun will ich davon Subklassen SubFx haben, die jeweils eine Funktionalität Fx implementieren.
Z.B. SubF1, SubF2, SubF3, ...
Jetzt will ich dass die einzelnen Subklassen auch die jeweils anderen Funktionalitäten haben:
SubF1, SubF1F2, SubF1F2F3 ...
Und danach will ich extensiv in meiner Basisklasse und den Subklassen herumpfuschen ohne andersowo Änderungen machen zu müssen
Decorator ist keine gute Lösung, da ich Methoden nach einer bestimmten Reihenfolge überschreiben muss. Man könnte vllt noch einschränken welche Subklassen des Interfaces man im Konstruktor zulässt. Andererseits will ich kleine Klassen haben und wenn ich Decorator verwende wimmelt es von Funktionen, die nicht direkt mit der Aufgabe der Klasse zusammenhängen.
Es wäre toll wenn es eine Klassen vom Typ ExtendableClass mit folgenden Eigenschaften gäbe:
Ich kann eine neue Klasse Plugin schreiben und sie der ExtendableClass hinzufügen.
Dabei werden alle Methoden die mit @add deklariert sind zur ursprünglichen Klasse hinzugefügt.
Alle Methoden die mit @replace markiert sind ersetzen die vorherige Methode in ExtendableClass.
Alle Methoden die mit @chain versehen sind werden in eine Kette mit der vorherigen Methode in ExtendableClass bzw. mit den vorherigen Methoden gehängt und nacheinander ausgeführt. Dabei kann wie beim Decorator auf den Rückgabewert der vorherigen Methode zugegriffen werden.
Von Plugin aus hat man Zugriff auf alle Attribute des ExtendableClass Objektes und allen anderen Plugins die der Klasse hinzugefügt wurden.
Ich habe versucht das ganze dynamisch zu implementieren was einigermaßen hingehauen hat. Ein statischer Ansatz wäre aber vermutlich schöner und man könnte tatsächlich die Klasse erweitern anstatt das Objekt. Dadurch bräuchte man auch keine umständlichen Methoden mehr, die vorher überprüfen ob das Attribut tatsächlich schon in ExtendableClass vorhanden ist. Man könnte auch noch eine Möglichkeit einbauen Abhängigkeiten zu benötigten Plugins aufzulösen.
So könnte man die verschiedenen Methoden sehr einfach statisch zu der Klasse linken.
Entschuldigt bitte die nicht ganz pythonische Ausdrucksweise.
Was denkt ihr dazu?
[Edit] "Funktionen" durch "Methoden" ersetzt