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