Kezdőlap › Fórumok › Programozás › Dinamikus osztály javaban, de hogyan?
- This topic has 41 hozzászólás, 5 résztvevő, and was last updated 6 years, 6 months telt el by jamesjohn70.
- SzerzőBejegyzés
- 2013-07-01-07:34 #1890637
Szeretnék Javaban egy aktív rekord osztályt létrehozni, aminek a leszármazottaival könnyen tudnék adatbázistáblákat kezelni.Legyen az aktív rekord osztályom AR, egy konkrét leszármazottja pedig UserRecord.Az lenne a legszebb, ha a keresés az aktív rekorddal valahogy így menne:
Code:UserRecord user = UserRecord.findByPK(id);Persze, a findByPK az AR osztályban lenne definiálva ...No, és itt haltam el. Ahogy végignéztem a netet, ezt így nem lehet. Találtam pár javas aktív rekord implelemntációt, de egyik sem tudott ilyen. A legszebbnek tűnő a find műveletnek átadja azt az osztályt paraméterül, amilyen eredményt várok.Megvallom, nagyon meglepett. Már az is, hogy osztályszintű műveleteket nem lehet felüldefiniálni, de hogy nem tudok szabadon osztályt létrehozni ...Elbizonytalanodtam. Mivel nem sokat dolgozom javaban, lehet, hogy a tudásom korlátos.Ti hogyan oldanátok meg "szépen" ezt a problémát?Hogyan tudnék az AR osztályból az aktuális leszármazottnak megfelelő objektumot generálni?
2013-07-01-13:31 #2207423Lehet, hogy nem jól értem, de szerintem az a szó, amit keresel az az öröklődés és nem a dinamikusság.Egy (AR-ből) származtatott osztály valahogy így néz ki:
Code:class UserRecord extends AR { /* UserRecord törzse */ }2013-07-01-13:56 #2207424Köszönöm, de sajnos nem pont erre gondoltam. Valóban, a class UserRecord extends AR. Amit én keresek, az a findByPK(long id) művelet definíciója, mert ugye azt nem írhatom, hogy
Code:public static AR findByPK(long id) { ... }És azt sem - mivel az AR osztályban definiálnám -, hogy
Code:public static UserRecord findByPK(long id) { ... }Tehát, már definiálni sem egyértelmű. Az meg külön kérdés, hogy a művelet törzsében hogyan definiálom a visszaadott objektumot, hogy ha a műveletet a UserRecord-ból hívom meg, akkor az eredménye UserRecord legyen.
Code:AR record = new AR(); // Jó lenne, ha már itt egy objektumfüggő típusú változóm lehetne ...record.setDataFromCursor(getCursorFromId(id)); // Ez valami művelet, ami kimazsolázza az adatbázisból, majd betölti az objektumba.return record; // Na, itt már UserRecord objektumot kéne visszaadni, de ez sajna nem az.Talán valami generic szerűség kellene, de nem tudom, hogyan ...
2013-07-01-15:05 #2207425Generics-el próbálkoznék. AR kapthatna egy paramétert mint generic, és akkor:
Code:class AR {public static findByPK(long id) { ... }2013-07-01-15:12 #2207426Vagy akár lehetne:
Code:class AR {public static findByPK(long id) { ... }2013-07-01-18:44 #2207427“AR record”-nak miért kéne UserRecord-ot visszaadni?De, ha pl. valamiféle lista elemet akarsz létrehozni, melynek a UserRecord az eleme AR a tárolója, akkor nem származtatott osztály kell.Valami ilyesmi lenne:
Code:public interface AR { /* add, iterator stb. függvények*/ }AR URContainer...(Lásd.: pl. List... sőt elméletileg, ha van megfelelő beépített tároló, akkor elvileg lehet abból is származtatni.)Nyilván lehet a UserRecord is egy olyan osztály, melynek származtatott osztályai vannak, ha pl. többféle (kezelés szempontjából specifikus) UserRecordokat szeretnénk kezelni.
2013-07-02-06:54 #2207428Code:class AR {public static findByPK(long id) { ... }2013-07-02-07:19 #2207429A szintaxis a következő:
Code:class AR {2013-07-02-15:11 #2207430Ilyet sikerült összehozzak:
Code:class AR {2013-07-02-16:32 #2207431Kezd egész bíztatóan alakulni! Már csak a statikus műveletekkel van gond.Keresni már lehene így:
Code:class UserRecord extends AR { - SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz