eigentlich könnte ich mich auch an
viewtopic.php?f=9&t=13411
anhängen denn meine Frage geht - möglicherweise - in eine ähnliche Richtung, siehe :
Segen und Fluch der objektorientierten Programmierung ist die Vererbung.charlytango hat geschrieben: Sa 6. Feb 2021, 19:34 Nun ist mein Ziel die Klasse TXY einfacher handhabbar zu machen -- also wenn nötig die Unit der Klasse TXY einzubinden ohne immer einen zusätzlichen Unit-Rattenschwanz mitzuführen. Gleichzeitig möchte ich aber ..
Die zieht einen Rattenschwanz an Units mit sich, von denen man sich nicht lösen kann.
Ich will's mal an einem Beispiel erklären:
Ich habe - mal angenommen - eine Audio-Software (DAW), die hat verschiedene Funktionalitäten
- Bedienoberfläche (GUI)
- Audio-Engine (I/O Interfaces und DSP-Kram)
- File-Management (gleichzeitige Nutzung vieler Files)
- Handling verschiedener File-Formate
- ... und keine Ahnung, was noch alles ..
Jetzt möchte ich mal nur diese Audio-Engine auch in einem anderen Programm verwenden.
Durch Querbeziehungen zwischen GUI, Audio-Engine und File-Management
ziehe ich beim einbinden eines einzigen TObjects ggf. den gesamten Rattenschwanz an Units mit,
die ich gerne getrennt lassen wollte. Es wird irgendwann ein nicht mehr entwirrbares Kneuel von Sourcecode.
Der Haken scheint mir zu sein, daß mir PASCAL (Lazarus) OOP hier vom Konzept her keine Hilfestellung gibt.
Ich kann nicht mal eben - unterstützt von der Sprache - eine unabhängige "Komponente" definieren, siehe auch
https://de.wikipedia.org/wiki/Komponent ... ntwicklung
https://de.wikipedia.org/wiki/Komponent ... ittstellen
Lazarus / Pascal ist leider keine "komponentenbasierte Sprache", sondern "nur" eine objektorientierte.
Meine aktuelle Idee wäre, die Kette der Vererbung ganz weit unten aufzubrechen.
1) Eine Basis-Klasse schreiben, die nur das Interface des TBasisObjekts definiert.
Diese Unit kann ich ohne großen Rattenschwanz überall einbinden.
2) darauf aufbauend das voll funtionierende abgeleitete TMyObject schreiben, das Interface muß aber gleichbleiben.
Ich darf also in abgeleiteten TMyObjects keine Definitionen in public und published hinzufügen, löschen oder überschreiben.
3) In der GUI könnte ich z.B. ein TBasisObjekt als Variable anlegen, damit sind in der GUI
die public und published Funktionen, Variablen etc. von TBasisObjekt bekannt und verfügbar.
Um ein von TBasisObjekt abgeleitetes Objekt zu benutzen, muß ich dann einen Pointer umbiegen:
Code: Alles auswählen
PZumInterfaceVonTMyObject:= TBasisObjekt( @MeineAbgeleiteteKlasse);
Ich will das in der nächsten Zeit mal ausprobieren, also ein Dummy-Beispiel-Projekt aufsetzen,
um zu schauen, ob das tatsächlich klappen würde.
Oder gibt es da bereits komponenten-basierte Ansätze, von denen ich noch nichts gelesen habe ?