 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
15.09.2005, 21:21
|
#1
|
|
TP-Junior
Registriert seit: Sep 2005
|
OO: Vererbung / Nichtvererbung von Klassennamen
Hallo, bin neu hier und sitze wie die Ochs vor diesem Berg:
Eine Mutterklasse wird von mehreren Kindklasse beerbt. Über diese Kinder soll eine statische (!) Methode der Mutter aufgerufen werden können, die dann den Namen des jeweiligen Kindes ausgibt. Klingt beknackt, darum ein Beispiel:
PHP-Code:
class Instrument {
// ...
static function wer_bin_ich() {
return [mein_name]; // um den Inhalt der eckigen Klammer geht es!!!
}
}
class Geige extends Instrument {}
class Wollharfe extends Instrument {}
$instrument1 = Geige::wer_bin_ich(); // soll 'Geige' ausgeben
$instrument2 = Wollharfe::wer_bin_ich(); // soll 'Wollharfe' ausgeben
Wäre schön, wenn jemand eine Lösung parat hätte. get_class() und __CLASS__ tun's allerdings nicht und mit $this oder so kann man auch nicht arbeiten.
|
|
|
15.09.2005, 21:39
|
#2
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Versteh ich richtig, dass dir get_class() nichts nutzt, weil du kein konkretes Objekt instanzieren willst?
Du könntest die statische Methode wer_bin_ich() in jeder abgeleiteten Klasse definieren und jede Implementierung den Klassennamen zurückliefern zu lassen, also:
PHP-Code:
class Instrument {
// ...
static function wer_bin_ich() {
return [mein_name]; // um den Inhalt der eckigen Klammer geht es!!!
}
}
class Geige extends Instrument {
statuc function wer_bin_ich()
{
return 'Geige';
}
}
...
$instrument1 = Geige::wer_bin_ich(); // soll 'Geige' ausgeben
Allerdings frag ich mich, was Du mit der Sache bezwecken willst: Wenn Du nur statische Aufrufe machst, dann kennst Du den Klassennamen doch sowieso von vornherein (Du musst ihn für den Aufruf ja kennen) ?
Geändert von seb (15.09.2005 um 21:41 Uhr).
|
|
|
15.09.2005, 21:49
|
#3
|
|
TP-Junior
Registriert seit: Sep 2005
|
Hallo, danke für die flotte Antwort.
Nein, get_class gibt eben nur den Namen der Mutterklasse zurück, und den will ich nicht wissen. Und jedesmal neu implementieren? Nee, das muss auch eleganter gehen ;-)
Ich brauche den Namen natürlich, um innerhalb der wer_bin_ich() weitere Schweinereinen damit anstellen zu können, beispielsweise eine Datenbanktabelle gleichen Namens auszulesen...
|
|
|
15.09.2005, 21:50
|
#4
|
|
TP-Senior
Registriert seit: Jan 2003
Ort: Darmstadt
|
verrat mir ma bitte, wo du das brauchst? in jedem fall, wenn du die statische methode als solche aufrufst, musst du den klassennamen schon wissen, sonst kannst sie gar nicht aufrufen.
der sinn einer static deklaration besteht darin, die funktion aus dem objektkontext herauszunehmen. natürlich funktionieren dann alle dinge, die vom objektkontext abhängig sind, nicht!
EDIT
oh, da hat man ja schon einiges geschrieben...
__________________
forenregeln - 3.d) ... richtige groß- und kleinschreibung benutzen ...
|
|
|
15.09.2005, 21:53
|
#5
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Zitat:
|
Ich brauche den Namen natürlich, um innerhalb der wer_bin_ich() weitere Schweinereinen damit anstellen zu können, beispielsweise eine Datenbanktabelle gleichen Namens auszulesen...
|
Den Namen einer Klasse von einer geerbten statischen Methode einer Mutterklasse zurückliefern zu lassen, funktioniert nicht. mutter::wer_bin_ich() hat keinen Zugriff auf kind::klassenname, wenn die Methode statisch ist, sprich sich das Ganze nicht innerhalb einer konkreten Objektinstanz abspielt.
Geändert von seb (15.09.2005 um 22:01 Uhr).
|
|
|
15.09.2005, 22:14
|
#6
|
|
TP-Junior
Registriert seit: Sep 2005
|
Zitat:
|
funktioniert nicht, weil statische Eigenschaften und Methoden nicht vererbt werden
|
Schon klar, ich dachte hier auch mehr an einen kleinen 'Trick' oder sowas.
Reflection tut es übrigens auch nicht. Was will ich damit? Um in meinem Beispiel zu bleiben: Ohne die Funktion jedesmal neu schreiben zu müssen, soll über Geige::wer_bin_ich() z.B. das Notenblatt für die Geige inkludiert werden (das dann meinetwegen geige.txt heißt), Trompete::... lädt entsprechend die Blasmusik rein etc.
Wie gesagt: nur ein Beispiel. Eigentlich geht es um etwas komplexeres ;o)
|
|
|
15.09.2005, 22:18
|
#7
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Und wieso willst du keine konkreten Objekte instanzieren? Damit wär das Problem auf einen Schlag gelöst.
|
|
|
15.09.2005, 22:22
|
#8
|
|
TP-Junior
Registriert seit: Sep 2005
|
Frag' nicht ;-) Es muss so sein...
|
|
|
15.09.2005, 22:37
|
#9
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Tja...dann wirst Du dein Problem wohl allein lösen müssen. Wir können dir schlecht helfen, wenn Du uns nicht verrätst, worum es eigentlich geht.
|
|
|
16.09.2005, 00:11
|
#10
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
@tower - da ich selbst Musiker bin, kann ich mir schon denken was Du vorhast.
Aber warum stellst Du nicht Deinen Ansatz mit in Frage ? Wenn Du eine galante Technik wünscht mit "Familen" von Instrumenten, aus denen sich die einzelnen Kindelemente ableiten lassen, so entspricht das ja dem normalen Vererbungsgesetz von Klassen.
Also zeig doch mal auf, was Du vorhast und lass uns darüber reflektieren - vielleicht geht Dir ja ein Licht auf oder uns fällt ein viel einfacherer Weg ein - aber dazu musst Du schon begründen, warum ein bestimmter Weg "gegangen werden muss"
Ich glaub kaum, das Du irgendwo auf fruchtbarere Ohren triffst als hier, darum kann ich Dir nur raten, das zu nutzen 
|
|
|
16.09.2005, 11:04
|
#11
|
|
TP-Junior
Registriert seit: Sep 2005
|
'Frag nicht' war doch mit einem Smiley versehen...
Ich weiss, dass ich das Problem mit einer instanzierten Geige und einer normalen, vererbbaren Klassenmethode umgehen kann, aber das möchte ich ja gerade vermeiden.
Im wirklichen Leben ist Instrument eine recht kostspielige Klasse mit allerlei Funktionen und wer_bin_ich() ist eine finder-Methode, die mir kein, ein oder viele Geigen-(Orgel- oder sonstwas)-Objekte zurückgibt. Ich möchte das Instanzieren einfach vermeiden, da ich noch nicht weiss, ob ich überhaupt ein Objekt zurückbekomme. Um zu erkennen, nach welchem Instrument ich eigentlich suche, will ich den Weg über Geige::finde(...) gehen. Dazu muss finde() ja wissen, dass ich eben nach einer Geige und nicht nach der Mutter Instrument suche, die entsprechenden Geige-Dateien öffnen etc.. Falls sich keine Geige findet, habe ich auch die große Mutter Instrument nicht instanziert, und das soll so sein. Wie gesagt: Schon möglich, dass das so überhaupt gar nicht geht...
|
|
|
16.09.2005, 19:15
|
#12
|
|
TP-Senior
Registriert seit: Jan 2003
Ort: Darmstadt
|
...ja
__________________
forenregeln - 3.d) ... richtige groß- und kleinschreibung benutzen ...
|
|
|
17.09.2005, 13:06
|
#13
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
ohne, dass ich mir den thread jetzt komplett durchgelesen habe ... der versuch einer loesung
PHP-Code:
class Instrument {
// ...
static function wer_bin_ich($name) {
echo $name; // hab die eckige klammer mal rausgenommen
}
}
class Geige extends Instrument {}
class Wollharfe extends Instrument {}
$instrument1 = new Geige();
$instrument1->wer_bin_ich('Geige'); // gibt 'Geige' aus
$instrument2 = new Wollharfe();
$instrument2->wer_bin_ich('Wollharfe'); // gibt 'Wollharfe' aus
was spricht dagegen?
gruss
hardy
|
|
|
17.09.2005, 13:21
|
#14
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Er will alles statisch haben und keine Objekte instanzieren.
|
|
|
17.09.2005, 13:50
|
#15
|
|
TP-Specialist
Registriert seit: Apr 2002
Ort: 743, evergreen terrace
|
gibt es dann nicht ne moeglichkeit, im construct der kindklassen den jeweiligen namen festzulegen und dann in der methode der elternklasse ausgeben zu lassen?
mal nur so ins blaue geraten (und mit dem wissen, dass es nicht funktionieren kann)
PHP-Code:
class Instrument {
var $name;
static function wer_bin_ich() {
echo $this->name;
}
}
class Geige extends Instrument {
function __construct() {
$this->name = "Geige";
}
}
class Wollharfe extends Instrument {
function __construct() {
$this->name = "Wollharfe";
}
}
$instrument1 = Geige::wer_bin_ich();
aber vielleicht hilft es, meinen gedankengang zu verstehen.
hardy
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr.
|
 |