Javascript szülő osztály hívásának továbbörökítése
Üdv.
Van egy kis gondom, amire nem találtam semmilyen megoldást.
A lényeg, hogy származtatni szeretnék osztályokat egymásból, és a szülő osztály függvényeit elérni. A gondom az, hogy a szülő osztályból hívott függvényben a this.parent nem a nagyszülőre, hanem a szülőre vonatkozik, és így végtelen ciklusba kerül. Ez persze logikus, viszont kíváncsi vagyok létezik e megoldás ennek kikerülésére.
Itt egy példa:
■ Van egy kis gondom, amire nem találtam semmilyen megoldást.
A lényeg, hogy származtatni szeretnék osztályokat egymásból, és a szülő osztály függvényeit elérni. A gondom az, hogy a szülő osztályból hívott függvényben a this.parent nem a nagyszülőre, hanem a szülőre vonatkozik, és így végtelen ciklusba kerül. Ez persze logikus, viszont kíváncsi vagyok létezik e megoldás ennek kikerülésére.
Itt egy példa:
Object.prototype.extend=function (source)
{
if (source)
{
for (var property in source)
{
if
(
(property in Object.prototype)
?
source[property]!==Object.prototype[property]
&&
this[property]===Object.prototype[property]
:
!(property in this)
)
{
this[property]=source[property];
}
}
}
return this;
};
Object.prototype.implement=function (source)
{
if (source)
{
for (var property in source)
{
if
(
!(property in Object.prototype)
||
source[property]!==Object.prototype[property]
)
{
this[property]=source[property];
}
}
}
return this;
};
Class=function (source)
{
return function ()
{
if (this.initialize instanceof Function)
{
this.initialize.apply(this,arguments);
}
}.implement(source);
};
Function.prototype.extend(
{
extend: function (source)
{
this.prototype.extend(source.prototype);
this.prototype.parent=source.prototype;
return this;
},
implement: function (source)
{
this.prototype.implement(source);
return this;
}
});
var a=new Class(
{
initialize: function ()
{
this.a=1;
}
});
var b=new Class(
{
initialize: function ()
{
this.parent.initialize.apply(this,arguments);
this.b=1;
}
}).extend(a);
var c=new Class(
{
initialize: function ()
{
this.parent.initialize.apply(this,arguments);
this.c=1;
}
}).extend(b);
var d=new c;
alert(d.a && d.b && d.c);
BUÉK
üdv Csaba
Ez is egy lehetőség
No az interface-el annyi a gond, hogy js-ben csak megvalósítást lehet megadni absztrakció helyett. Ettől függetlenül megoldottam úgy, hogy az alapból megadott függvényeket az osztályhoz társítja, az implementáltakat pedig nem.
második blikk : klauzúra
üdv Csaba
Beleférne
Ott kezdődik, hogy a Object.prototype.extend csak egy segédfüggvény, aminek semmi köze nincs az osztályokhoz. Annyit csinál, hogy hozzáadja a source tulajdonságait az objektumhoz, ha még nincsenek megadva.
pl:
A függvények köré olyan burkoló függvényt kell tenni, ami a this.parent értékét folyamatosan átírja. Meg lehet oldani ezen az úton is, de az már inkább gányolás kategória. A burkolófüggvényes megoldásokat nem szívesen használom amúgy sem, mert egy függvény hívásból kettőt csinálnak. (Mondjuk az apply vagy a call is, de azok legalább beépítettek...)
javítás
üdv Csaba
ui: hogy most gány vagy nem, ha lett volna jobb ötletem azt írom be ;), jó rég foglalkoztam ilyesmivel komolyabban...sajnos nem tipikus napi feladat, "hogy a Object.prototype.extend csak egy segédfüggvény" ha már müxik oda rakod ahova akarod :) engem most csak a probléma izgatott (mint logikai feladat :) )
Tetszik
még bírja :)
üdv Csaba
azért nem tökéletes
javitás
D:0
D:1
D:1
D:2
D:3
D:3
D:4
kontextus nem változik, de lépked felfele az öröklődőséi fán, ha átírom a
D:0
C:1
B:1
A:2
B:3
C:3
D:4
jónak látszik
üdv Csaba
jav. :
és ígymár a tegnapi
1
2
2
3
4
4
5
kimenetet adja, 1 2 3 4 5 helyett, ooopsi
:D
Saját