Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

class extends invertiert

Klassen vererben in "anderer" Richtung

Also, ich habe mehrere Klasse, als beispiel:

Code:                   In Zwischenablage kopieren (nur IE)
1">

in der haupt befinden sich ein paar funktionen, der größte teil befindet sich jedoch in den erweitertx.
so nun habe ich am anfang nen aufruf alla

Code:                   In Zwischenablage kopieren (nur IE)
2">

soweit alles kein problem, nur hab ich wohl ne art "absichtlicher denkfehler".
in den erweitertx-classen befinden sich immer sehr ähnliche dinge. genaugenommen die gleichen funktionen nur mit meist nur leicht unterschiedlichem inhalt da ich bei verschiedenen "funktionsarten" zwar einen identischen ablauf habe, jedoch eben leichte unterschiede in den inneren teilen.
hier jetzt den realen aufbau meines scripts zu erklären würde etwas den rahmen würde etwas den rahmen sprengen da es dafür doch etwas zu kompliziert ist, daher mal eine abwandlung wie es in der realität vorkommen könnte ;):

Code:                   In Zwischenablage kopieren (nur IE)
3">

ok zugegeben is nen dummes beispiel aber hoffe ihr versteht was ich meine ;)
nun möchte ich am liebsten sagen:
Code:                   In Zwischenablage kopieren (nur IE)
4">

dann soll er innerhalb der bauen erkennen ahja das ist der und der werkstoff (das is nich so das problem, er bekommt als parameter noch ne nummer anhand dessen er sich das entweder berechnen oder aus ner datenbank auslesen kann) und dann die entsprechenden funktionen dafür "nachladen" so das ich dann ohne darauf zu achten was genau es ist dann mit
Code:                   In Zwischenablage kopieren (nur IE)
5">

immer ohne berücksichtigung der art und weise arbeiten kann bzw möchte.
ist sowas irgendwie möglich? oder gibt es nur wege wie eine externe funktion welche das erst nachprüft was es ist und dann die entsprechende kindklasse wählt? oder kann ich die daten irgendwie "kopieren" also etwas alla
Code:                   In Zwischenablage kopieren (nur IE)
6">

bzw wie müsste sowas aussehen... sorry bin recht neu was das mit den klassen angeht aber evtl versteht ja jemand was ich meine.

ps: ja ich weiss die syntax ist nicht annähernd korrekt, mir gehts hier auch reinweg erstmal um die theoriefrage und nicht um die korrektheit der befehle als solches... dazu muss ich erstmal wissen welchen befehl ich dafür nutzen könnte ;)

danke schonmal für eventuelle tips wie man sowas lösen könnte...
Hier gehts zum Orginal Eintrag "class extends invertiert" im Forum

Antworten

Hoffe das richtig verstanden zu haben, aber dein lösungsversuch ist meines erachtens der einzig richtige, sonst könntest du das ganze ja auch mit dummen functions machen...

endresultat wäre für mich:
$objekt->Baustoff = "Holz";
$objekt->festmachen();

denn ich will mich ja nicht drum kümmern wie ich holz festmache dafür hab ich ja meine klasse.
jedoch versteh ich nicht ganz warum du das ganze in derart viele "extends" zerpflückst...


2.

erstmal danke mnc :)

Zitat:
jedoch versteh ich nicht ganz warum du das ganze in derart viele "extends" zerpflückst...
eigentlich recht einfach...
also um beim beispiel zu bleiben gibts ne funktion zum schrauben, zum kleben und zum nageln... nun dachte ich mir je nach werkstoff lade ich halt nur die funktionen hinzu die ich für den werkstoff brauceh (innerhalb der "werkstoffklasse" unter entsprechendem namen dann halt) anstatt jedesmal innerhalb der festmachen() zb per
Code:                   In Zwischenablage kopieren (nur IE)
7">

zu unterscheiden... ok ist möglich aber da es nicht nur festmachen gibt sondern auch noch nen haufen andrer funktionen (zb sägen, kaufen,... :P) müsste ich in jede dieser class-internen funktionen nen switch packen um zu unterscheiden und dies würd ich mir mit dem extend gerne ersparen.
nur wie bekomme ich ihn dazu die entsprechenden funktionen "nachzuladen"... gibts da was oder ist der weg über switch oder eben eine vorherige überprüfung vor objektzuweisung der einzige weg?
wäre auch sinnvoll in der hinsicht als das verschiedene "kindklassen" hier von unterschiedlichen personen bearbeitet würden - also zb einer macht "holz" einer "stahl"... so könnte jeder für sich seine extends-classe schreiben ohne den andeen zu beeinflussen und eben auch ohne innerhalb der "bauen-class" immer für ne zusätzlcihe an x stellen nen neues case einzufügen...

hoffe das ist so verständlich....


3.

Vererbung muss unbedingt richtig angewandt werden, um ihre Vorteile auszuspielen, ansonsten bringt sie mehr Ärger ein als alles andere. Deshalb lohnt es sich immer, mal einen Blick von außen auf das zu werfen, was man eigentlich machen will.

Du hast: Verschiedene Baufstoffe wie Holz, Metall, Plastik. Und Du hast verschiedene Verarbeitungsmöglichkeiten wie nageln, schrauben, kleben.

Allein durch diesen Satz wird mir eigentlich klar, dass Du mind. ZWEI Hauptobjekte haben willst, nämlich "Baustoff" und "Verarbeitungsmöglichkeit".

Dann kann man sich überlegen, ob man "Verarbeitungsmöglichkeit" nicht lediglich als Interface definiert, das von den Baustoffen implementiert werden kann (oder auch nicht). Denn es ist ja z.B. nicht sehr sinnvoll, Holz zu schweißen, warum sollte es also das Interface "Schweißbar" dann überhaupt implementieren?

Grundsätzlich falsch ist es aber wohl, eine "Bauen"-Klasse zu machen (also eine Klasse, die eine oder mehrere Tätigkeiten beschreiben will) und davon direkt die Werkstoffe abzuleiten (also Klassen, die lediglich den Werkstoff beschreiben, die sich aber "zufällig" auch verbauen lassen). Das ist Vererbung falsch angewendet, da "nageln" irgendwie keine Verallgemeinerung von "Holz" ist.


4.

tja- hab momentan nur php 4.x zur verfügung daher wird das mit interfaces wohl nix :(
ansonsetn schonmal ne nette antwort, nur glaub wir haben zumindest minimal aneinander vorbeigeredet...

ich möchte das ja so haben das ich halt keine funktion habe mit dem namen schrauben oder schweissen, sondern eben nur dieses "festmachen" und er soll dann das entsprechende nutzen. also ich würd gerne zb 3 funktionen "festmachen" mit unterschiedlichem inhalt anlegen und abhängig vom werkstoff nur die benötigte zur class hinzufügen... jetzt wo ich mir das mit den interfaces mal "angelesen" habe scheint das ja doch etwas in die richtung zu gehen... obwohl ich bei dem beispiel auf http://de2.php.net/manual/de/language.oop5.interfaces.php nicht wirklich durchsteige - bzw sehe da noch nich so ganz den sinn?
gibts nicht irgend ne möglichkeit ne funktion in eine objekt zu packen nachdem ich die classe hinzugefügt hab?
ich möchte ja im späteren programmablauf noch xmal auf dieses objekt zugreifen und dann unabhängig ob es nun "holz", "stahl", "plastik" oder sonstwas ist immer mit dem gleichen code (also zb festmachen) das entsprechende erreichen... nicht mehr und nich weniger ;)


5.

Ahso, so wird natürlich ein anderer Schuh draus. Natürlich kannst Du definieren: "Jeder Werkstoff lässt sich (irgendwie) festmachen." Das ist dann legitim und kann in der Oberklasse definiert werden. Die eigentliche Implementierung dieser Methode kann man dann den einzelnen Werkstoffen überlassen.

Dann musst Du aber natürlich zwingend auch "new Holz()" und nicht "new Werkstoff()" schreiben, denn Objekte, die lediglich "Werkstoff" sind, existieren ja auch in der realen Welt nicht und dürfen auch nicht im Programm existieren. Sprich: Du musst Dich von Anfang an entscheiden, welcher Werkstoff das schließlich werden soll.


6.

ok oimel danke
genau das hab ich mir gedacht :( und da gibts also auch wirklcih keinen weg drumherum? hm naja gut dann muss ich mir wohl doch ausserhalb der class noch ne funktion schreiben welche mir das vorher raussucht und dann das entsprechende objekt erzeugt :(

aber verstehe ich doch richtig das ich dann einfach sagen kann:
class werkstoff {
<einwenigcode>
}
class holz extends werkstoff {
function festmachen {
}
}
class stahl extends werkstoff {
function festmachen {
}
}

und dann
$objekt1 = new holz();
$objekt2 = new stahl();

und dann einfahc mit denen arbeite?
dein
Zitat:
Natürlich kannst Du definieren: "Jeder Werkstoff lässt sich (irgendwie) festmachen."
bringt mich jetzt leicht durcheinander? muss ich nu scho in der class werkstoff die "festmachen" irgendwie definieren? dachte genau das erspar ich mir durch das extends?


7.

Natürlich gibts da Wege drum herum, allerdings sind die problemspezifisch und setzen somit auf einer ganz anderen Abstraktionsebene an.

Und dass man jeden Werkstoff "festmachen" kann, bedeutet lediglich, dass jeder Werkstoff diese Schnittstelle definiert.


8.

Vielleicht solltest Du Dir mal das "Factory" Pattern ansehen. Das ist eine Funktion, die den Konstruktoren vorgeschaltet ist und den jeweils passenden heraussucht. Etwa so:

Code:                   In Zwischenablage kopieren (nur IE)
8">




9.

hm stimmt schön einfach eigentlich wenn man sich das überlegt :) danke pecos - glaub damit werd ich erstma weiter arbeiten ;)


10.

Wobei man in einer konsequent objektorientierten Umgebung die "Factory" besser als statische Methode oder sogar als eigene Klasse implementiert. Ich mag diesen OO-Nicht-OO-Mischmasch ja nich...


Hier gehts zum Orginal Eintrag "class extends invertiert" im Forum
 
phpforum.de | Impressum | Handy Bundles