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 7 years, 2 months telt el by
jamesjohn70.
-
SzerzőBejegyzés
-
2013-08-31-06:39 #2207452
A probléma lényege úgy tűnik az, hogy egy statikus művelet nem képes lekérdezni, hogy éppen milyen osztályban van. (Leginkább gondolom azért, mert nincs igazi statikus öröklés.)Ez a kód ezt azzal játsza ki, hogy létrehoz egy statikus osztályt, amiben a SecurityManager-től lekéri a hívási vermet, amiből ki tudja deríteni, hogy melyik az az osztály, amelyik a statikus műveletet hívta. (Azért kell külön osztály, mert a
2013-08-31-11:14 #2207453Naná, hogy nem képes semmi „dinamikusat” csinálni, mivel pont az a lényege, hogy statikus, azaz minden körülmények között azonos.Persze még, ha mondjuk egy olyan bármilyen nyakatekert hülyeséget is megengedő nyelvről lenne szó, mint a C++, akkor egy általános statikus memóriaterületre le lehetne menteni egy dinamikusan létrehozott objektum címét és elvileg egy típusazonosítót is, hogy a típusazonosító használatával lehessen futtatni valamit:
Code:static void *pointer;static int type;class Class { public: Class() { pointer = this; type = 1; } void func() { printf("hello world"); }};void call_func() { if ( type == 1 ) { static_cast(pointer)->func(); }}int main() { Class(); call_func(); return 0;}Persze, ha erre gondolsz. Kérdés, hogy ennek van-e valamilyen értelme... azon kívül, hogy meg lehet csinálni.
2013-08-31-11:37 #2207454A „minden körülmények között” szerintem túl erős megfogalmazás. Én úgy tudom, a statikus attól statikus, hogy nem az objektumhoz kapcsolódik, hanem az osztályhoz. Ettől még a származtatott osztály tudhatná magáról, hogy származtatott.A C++ nyelvben annyira nem vagyok otthon, azt sem tudom, ott jelentkezik-e ez a probléma egyáltalán. Ha ott sem lehet lekérdezni statikusan az aktuális osztályt - aminek a nevében fut a művelet -, azaz ott sincs statikus öröklés, akkor félek, az ilyen trükkök ott sem segítenek, mivel egy statikus művelet meghívása esetén nem tudod megállapítani, melyik osztályban vagy, és nem tudsz semmi olyant futtatni, ami az adott osztályhoz kapcsolódik.
2013-08-31-12:43 #2207455Nem, nem kell hogy az osztályhoz kapcsolódjon, amint az előbb szemléltettett példa mitatja.. Habár a java eléggé osztályorientált.Amúgy hogy tudná "magáról", amikor ismétlem pont az a lényege, hogy a statikus adat egyszer, azaz egyszer deklarálódik és így ugyanaz minden objektumban. Tehát eleve nem tudhatja megáról, kivéve, ha pl., amint szemléltettem egy objektum címét írod be a statikus területre. Persze ezzel, mint korábban mondtam az a baj, hogy a statikus címterület ugyanaz, azaz egy másik felülírja egy másik adattal, ami nem szálbiztos. (Sőt ebben az esetben egy szál esetén sem biztos a kimenete, ha nincs elmentve az eredeti adat.)Ha pedig egy osztály (szülő-gyerek/objektum cím) szerint változó mechanizmust szeretnél, azt nem értem, hogy miért statikusan "kell" deklarálni, amikor a statikusság arra alkalmatlan a másikat meg pont arra találták ki.
Code:class Parent {/* akár így is: String name; */String myName { return "Parent";2013-08-31-15:55 #2207456A cél egy örökölhető konstruktor művelet létrehozása, ami mindig olyan objektumot hoz létre, amilyen osztályból meghívod. Az osztályon kívüliség nem megoldás, mivel ezt akarjuk elérni:
Code:class ActiveRecord {2013-08-31-17:51 #2207457Ehhez pl. minek statikusan deklarálni?
Code:class ActiveRecord {public String findByPK(long id) {return "I'm ActiveRecord"}}class User extends ActiveRecord {public String findByPK(long id) {return "I'm the little child of ActiveRecord"}}Így mindig az a függvény hívódik meg, ami kell. És nem csak azt tudja, hogy milyen "osztályban van", de személyesen az objektum címét is tudja (this).
2013-08-31-19:10 #2207458Minden objektumot létre kell hozni egyszer.Egy aktív rekord gyakran egy keresés eredményeként jön létre. Vagyis, az objektumot létrehozó művelet, ha az osztály része, nem lehet más, csak statikus.Más nyelveken, amiken eddig használtam az aktív rekordokat, így vannak implementálva. Most, hogy jávában kellenek, szeretném ugyanazt a módszert használni. A jávát úgy ismertem, mint a lehetőségek nyelvét, ezért lepett meg, hogy egy gyakran használt konkstrukciót nem lehet benne megvalósítani. És még az elvi akadályát sem értem. Azt értem, hogy technikailag így egyszerűbb implementálni, de elvileg (programozás elméletileg) nem értem, mi kifogás lehet a teljes statikus öröklés ellen.
2013-09-06-15:34 #2207459„Minden objektumot létre kell hozni egyszer.”De nem mindegy, hogy hogy, meg hol.A normál változó függvényenként jön létre (saját stack területén), amíg a statikus a függvényen kívül (az adatszegmensben).
objektum {valami: (deklaráció helye)valami <= akármi (tartalom beírása)}
Így a new-val létrehozott minden objektumnak saját valami területe van.
objektum#1 {akármi:}objektum#2 {akármi:}
Mivel minden objektumnek saját valamije van, ezért természetesen az akármiből elérhető az objektum minden tagja.
objektum {statikus_valami <= akármi (a tartalom beírása - természetesen marad a függvényben)}statikus_valami: (deklaráció helye a függvényen kívül)
Így a new-val létrehozott objektum mindegyikének egy azonos statikus_valami-je van.
objektum#1 {}objektum#2 {}statikus_akármi:
Az objektumoknak egy statikus_valamije van csak így fizikailag lehetetlen hivatkozni az objektum tagjaira. Kivéve persze azt az esetet, amikor magában a statikus_valamiben tároljuk valamely objektum címét. Persze ebben az esetben is csak arra az egy objektumra lehet hivatkozni.Remélem így már érthető a statikus és a normál deklaráció közötti különbség.
2013-09-06-15:43 #2207460Az elemben és nem konténerben tárolt kereső függvénnyel szintén van egy gond.Ha a konténerben van a kereső algoritmus akkor hozzáfér az elemekhez:
konténer {elemek_listájaelem keresés () {this->elemek_listája}}
Amíg, ha elemben van, akkor csak paraméter átadással lehetséges ez:
elem keresés (elemek_listája) {}
Ez utóbbi persze teljesen jó (csak hát van egy praktikusabb lehetőség a C++/Java stb-ben a sima C-hez képest).Ráadásul maga a függvény futása szállbiztos, mert saját stack területe van. (Az adatátadásról - mivel valószínűleg csak címről van szó - ez nem mondható el, de nem is biztos, hogy kell.)
2013-09-06-15:56 #2207461Ami még a problémád a különböző elemek tárolása egy konténerben.Ennek a feloldása Java alatt két praktikus módon lehetséges.
- formázatlan adatátvitellel Input/OutpuStream-mel
- Java Objektummal
1) pl.: valamilyen input stream (akár zip is lehet) (byte)
Code:public class MyDataInputStream extends ...InputStream implements DataInput { -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz