gruss Stefan,
...
ich habe eine BasisKlasse namens Control. In dieser Klasse gibt es
eine Methode Paint. Natürlich gibt es auch Klassen die von dieser
Methode erben. In diesen wird die Methode Paint überschrieben.
Allerdings möchte ich gerne, dass der Code der bereits in der
Basisklassen Paint Methode definiert wurde auch ausgeführt wird.
obwohl ich davon ausgehe, dass Du die begriffe »Basisklasse« bzw.
»Klasse« nur zur beschreibung Deines beispiels verwendest, bemuehe
ich vor einer antwort nochmal das mantra:
alle vererbungskonzepte in JavaScript sind klassenlos und basieren
ausnahmslos auf delegation. die bei weitem am haeufigsten bemuehte
vererbung basiert auf objekten, die als prototypen ueber konstruktor-
funktionen referenziert werden (prototypische vererbung).
auf der ebene *einfacher* und nicht in abhaengigkeit zueinander oder
in anderer beziehung stehender objekte greift das konzept der schnitt-
stellenvererbung viel direkter - genau dafuer haelt jedes [Function]
-
objekt die methoden [call]
und [apply]
in seinem arsenal vor.
objekt-literale und schnittstellen-vererbung
diese *woertelei* ist wichtig, da sich Dein beispiel mit den JavaScript
zugrundeliegenden begriffen auf wunderbare weise genau an Dein von Dir
gewuenschtes ziel brigen laesst.
»» function Control()
> {
> this.Paint = function()
> {
> [mach was]
> }
> }
>
> function Label()
> {
> this.Paint()
> {
> <baseclass>.Paint();
> [mach noch mehr]
> }
> }
> Label.prototype = new Control();
var Control = function () {
//falls [[Control]] selbst ein objekt als [prototype]n referenziert:
this.constructor = arguments.callee;
this.status = "[object Control]";
this.paint = function () {
//Dein: [mach was]
alert("executing [object Control].paint :\n[this].status : " + this.status); // [1]
};
};
var Label = function () {
//da [[Label]] selbst ein [Control]-objekt als [prototype]n referenziert:
this.constructor = arguments.callee;
this.status = "[object Label]";
this.paint = function () { //
//(new Control()).paint.apply(this); // aber da es sich hier um den prototypen handelt:
this.constructor.prototype.paint.apply(this); // [2] delegation - Dein: <baseclass>.Paint()
// Dein: [mach noch mehr]
alert("executing [object Label].paint :\n[this].status : " + this.status); // [3]
};
};
Label.prototype = new Control();
var myControl = new Control();
var myLabel = new Label();
myControl.paint(); // executing [object Control].paint ... [this].status : [object Control] // [1]
myLabel.paint(); // executing [object Control].paint ... [this].status : [object Label] // [2]
// executing [object Label].paint ... [this].status : [object Label] // [3]
dabei realisiert [2] das von Dir gewuenschte »<baseclass>.Paint();
«, indem es die [paint]
-methode
des als objekt-prototypen *vererbten*/referenzierten [Control]
-objekts im kontext eines [Label]
-
objekts aufruft.
so long - peterS. - pseliger@gmx.net
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]