![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Neuer Benutzer Registriert seit: 12.09.2006
Beiträge: 12
|
Hallo Leute, ich habe ein kleines Problem: Ich habe 3 Klassen, wobei Klasse B und C von Klasse A abgeleitet sind. Nun möchte ich beim Erzeugen eines Objektes der Klasse C in der Klasse A spezifische Änderungen durchführen lassen (ebenso, wenn ich ein Objekt nach Klasse B erzeuge), die von der aufrufenden Klasse abhängig sind. Gibt es eine Möglichkeit, die aufrufende Klasse zu ermitteln? Mfg, kari01 |
| | |
| | Nach oben #2 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Da alles was in A ist, auch in B/C ist, brauchst du nichts bei A ändern, denn A ist einfach ein Teil des Objekts von B bzw C (je nachdem). Was genau willst du denn ändern? Weil ehrlich gesagt glaube ich, dass dir die Vererbung noch nicht zu 100% ins Blut übergegangen ist. Verfeinere bitte deine Frage mit einem Beispiel und ich kann meine Antwort verfeinern.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #3 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
|
Jetzt ohne große über Vor-/Nachteile nachgedacht zu haben .. PHP-Code: [Nachtrag] Sehe zwar gerade nicht den Sinn und Zweck, aber nunja ... Geändert von Ben (12.09.2006 um 15:51 Uhr). Grund: Nachtrag hinzugefügt |
| | |
| | Nach oben #5 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
|
Ah, gibt es ja auch ein Beispiel im Manual zu, auch wenn dieses ein wenig inkorrekt ist. Aber das Prinzip kann man ja erkennen. |
| | |
| | Nach oben #6 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Ich versuche noch den Sinn zu verstehen... *help*
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #7 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Ich hab zum Besipiel eine abstrakte View-Klasse mit einer Methode display(). Diese kann überschrieben werden, lässt aber, wenn sie eben nicht überschrieben wird, ein Template parsen und ausspucken. Der Name des Templates wird automatisch aus dem Namen der View-Klasse abgeleitet. Folglich muss die abstrakte View-Klasse ja "wissen", von welcher Klasse das Objekt ist, das da von ihr abgeleitet wird. Basti |
| | |
| | Nach oben #8 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Hm... ich hätte das mit ner Klassenvariable und nem Konstruktor gelöst...
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #9 |
| Neuer Benutzer Registriert seit: 12.09.2006
Beiträge: 12
|
Ok, ich versuch es zu verdeutlichen. Klasse A ist eine Allgemeine Benutzerklasse, sie enthält Funktionen zum Löschen, Ausgeben von allgemeinenen Benutzerinfos und sonstigen Krimskrams. Jedoch sind einige Funktionen teilweise abhängig davon, wer die Kindklasse ist - ausgabe von Benutzerinformationen ist zum Beispiel so angelegt, dass die Queries, die erzeugt werden, jeweils auf die Subklasse zugeschnitten sind (da die Daten in unterschiedlichen Tabellen liegen), das Prinzip jedoch bei allen gleich. Klasse B/C (extends Klasse A), sind spezielle Benutzer, die nur noch ihre Besonderheiten enthalten, zum Beispiel abweichende updates und inserts. Im Moment muss ich noch beim Objekterzeugen klarmachen, welche Kindklasse Klasse A aufruft. Jedoch soll Klasse A optimalerweise selber herausfinden, von welcher Klasse sie erweitert wurde. Geändert von kari01 (12.09.2006 um 16:37 Uhr). Grund: kleinere erweiterung |
| | |
| | Nach oben #11 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
was auch immer dein "DRY!" heißen soll. Normalerweise sollen doch nur Gemeinsamkeiten in der "Vaterklasse" sein, demzufolge wiederspricht es doch der Logik von Vererbung, wenn in der Vaterklasse funktionen sind, die je nach Kindklasse anders arbeiten sollen. Da wäre es sinnvoller, in den Kindklassen die Funktionen zu überladen...
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #12 |
| Neuer Benutzer Registriert seit: 12.09.2006
Beiträge: 12
|
Ansich sind es ja wirklich nur die Queries die minimaler Anpassung bedürfen und ich war daher der Ansicht, dass sich die Elternklasse etwas flexibel zeigen könnte ^^. Völlig falscher Ansatz? [PS] DRY - Don't repeat yourself Geändert von kari01 (12.09.2006 um 16:56 Uhr). Grund: PS hinzugefügt |
| | |
| | Nach oben #13 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Danke für die Erklärung. Zum Glück habe ich mich ja nicht wiederholt. Back to topic: Wenns nur kleine Änderungen sind, ists aus Gründen der Bequemlichkeit sicherlich verständlich und es ist nichts dagegen zu sagen. Allerdings wiederspricht es doch eher meiner Logik der Vererbung. Aber vielleicht sehe ich das auch etwas zu verbissen.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #14 |
| Johannes Schlichenmaier Registriert seit: 26.08.2005 Ort: Mannheim
Beiträge: 395
|
Nimm WarrenFaith' Vorschlag und überlade die Konstruktoren. Du kannst ja alles gemeinsame in eine Methode in die Elternklasse packen, wenn du willst. Is sicherlich sauberer ...
__________________ In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
| | |
| | Nach oben #15 |
| Neuer Benutzer Registriert seit: 12.09.2006
Beiträge: 12
|
Um meine momentane Lösung mal zu zeigen... Nur halt wäre es mir lieber, wenn user von selbst drauf kommt, dass club ihn extended hat ^^ PHP-Code: PHP-Code: Geändert von kari01 (12.09.2006 um 17:31 Uhr). Grund: kleiner fehler |
| | |
| | Nach oben #16 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
| PHP-Code: PHP-Code: Ich versteh aber noch nicht so ganz warum deine Klassenvariablen alle static sind. Aber gut, du wirst schon wissen warum (hab sicherlich wieder was übersehen).
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #18 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
also man kanns übertreiben, von daher denke ich, dass es so definitiv ok ist. ansonsten ist jeder weg der geht sauber *duck und renn*
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #19 | |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Wichtig ist einfach, dass du das Gemeinsame in die User-Klasse auslagerst (Generalisierung ist hier vielleicht der klarere Ausdruck, als Vererbung). Das kann genausogut eine Methode sein, die immer das gleiche tut (hier kannst du durch Parameter aus der speziellen Klasse auf die Methode der generellen Klasse "einwirken"), als auch eine, die sich auf den Zustand des Objektes bezieht (diesen kannst du vorher entsprechend verändern). Natürlich kannst du eine Methode auch überschreiben - entweder "komplett", wenn das spezielle Verhalten vom generellen komplett abweicht oder, indem die Methode quasi dekoriert wird, also vielleicht zuerst eine Operation durchgeführt wird und dann die Methode der Basisklasse aufgerufen wird. Und genau das tust du ja (bzw. umgekehrt), allerdings nicht konsequent. Die Prüfung, ob es Daten ($data) gibt machst du z.B. doppelt. Das ist unnötig. Auch nicht sauber ist, dass die Methode plötzlich nichtmehr die ID sondern true zurückgibt, wenn es klappt. Besser: PHP-Code: |