Dinamikus osztály javaban, de hogyan?

Kezdőlap Fórumok Programozás Dinamikus osztály javaban, de hogyan?

10 bejegyzés megtekintése - 31-40 / 42
  • Szerző
    Bejegyzés
  • #2207452
    linuxforum
    Felhasználó

      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

      #2207453
      pointux
      Felhasználó

        Naná, 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.

        #2207454
        linuxforum
        Felhasználó

          A “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.

          #2207455
          pointux
          Felhasználó

            Nem, 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";

            #2207456
            linuxforum
            Felhasználó

              A 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 {

              #2207457
              pointux
              Felhasználó

                Ehhez 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).

                #2207458
                linuxforum
                Felhasználó

                  Minden 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.

                  #2207459
                  pointux
                  Felhasználó

                    “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.

                    #2207460
                    pointux
                    Felhasználó

                      Az 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.)

                      #2207461
                      pointux
                      Felhasználó

                        Ami 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 {

                      10 bejegyzés megtekintése - 31-40 / 42
                      • Be kell jelentkezni a hozzászóláshoz.