Kérdéses objektumszerkezet

Kezdőlap Fórumok Programozás Kérdéses objektumszerkezet

8 bejegyzés megtekintése - 1-8 / 8
  • Szerző
    Bejegyzés
  • #2052969
    pointux
    Felhasználó

      Javaslom az inheritance (öröklés) címszó alatt található adatok tanulmányozását…
      „B leszármaztatható A-ból, de semelyik Ax-bõl.”
      class B : public A – B örökli A összes tagfüggvényét, úgy ahogy van
      class Ax : private A – az öröklött tagok priváttá válnak, tehát class C : public Ax esetén sem érheti el C az A tagjait, az Ax tagjait, pedig csak akkor, ha azok nem private-tal vannak deklarálva.

      Akármi (A) felülírása (B-ben):
      class A…
      virtual … akarmi…

      class B : …. A
      … akarmi …

      (polymorphism)

      #2052970
      linuxforum
      Felhasználó

        Szerintem nem kell, de a hasonló megoldások elkerülése végett jelzem, hogy – sajnos – PHP-ben kellene kódolni (4.3), ahol csak publikus osztályelemek és öröklés van. A leszármaztatás folyamán minden öröklõdik, maximum felülírható.
        De attól tartok, a problémámra a részleges öröklés sem lenne megoldás, hisz tömören azt szeretném, hogy bármelyik A1, A2, A3 osztálynál meg lehessen adni, hogy A-ból vagy B-bõl származzon – anélkül, hogy két osztálydefiníciót kellene létrehozni. (Késõbb persze C-, D-, E-bõl). Vagyis Ax definíciója során egy elkõre nem ismert – de A-ból származó – osztálytól kellene származnia. Persze a helyes mûködéshez elég A-ból származtatni, de ezt késõbb lehessen megváltoztatni – új jellemzõk eléréséhez.
        Erre persze nincs nyelvi lehetõség, ezért ennek szimulációjára, vagy helyes alternatív kódolására vagyok kíváncsi.

        #2052971
        pointux
        Felhasználó

          „Erre persze nincs nyelvi lehetõség, ezért ennek szimulációjára, vagy helyes alternatív kódolására vagyok kíváncsi.”
          Hát ha ezt nem lehet megcsinálni, akkor szívás… én nem tudom (tudtam), php-ben soha nem akartam ilyet csinálni…

          #2052972
          linuxforum
          Felhasználó

            Szerintem ezt nem csak PHP-ben nem lehet megcsinálni, hanem általában nem. Legalábbis azon nyelvekben nem, ahol egy osztály csak egynek lehet a leszármazottja, ráadásul, hogy melyiké, az fordítási idõben dõl el. (Talán még a Java sem tud futásidõben osztáyldefiníciót létrehozni … de azért ebben nem vagyok biztos. De ha tudna a serializációval lenne rendesen problémája! 🙂

            Kényszermegoldásként létrehoztam egy külön property-t az A osztályban, s a változó mûveleteket ennek a propertynek a mûveleteivé tettem. Igaz, mivel az eredeti objektum egyéb mûveleteire is szükség van, ezért minden kiemelt mûvelet megkapja az eredeti objektumot is paraméterként.

            #2052973
            pointux
            Felhasználó

              „Talán még a Java sem tud futásidõben osztáyldefiníciót létrehozni … de azért ebben nem vagyok biztos.”
              Amíg c++-ban, ahhoz, hogy futásidõben jöjjön létre az osztály, ahhoz a virtual szó kell, amíg javaban eleve minden dinamikus, ezért soha nem kell virtual (hacsak nem static) – ez egyébként az összes modernebb nyelvben így van, de a c elég ódivatú -…. ezért tûnhet úgy, hogy nem tudja, pedig, de 🙂
              class szam {…}
              class egy extends szam {…}
              class ketto extends szam {…}

              szam[] sz = new szam[2];
              sz[1] = new egy();
              sz[2] = new ketto();

              Fordításkor ebben az esetben nem lehet tudni, hogy melyik tag függvény hívódjon meg (…).

              Az pl nem tudom php-ben van-e, de javaban a super-rel meg lehet hívni a szülõ azonos függvényét…

              Az igaz egyébként, hogy javaban nincs többszörös öröklõdés (problémák elkerülése végett vették ki), de implementáció van… ennek elvileg php-ben is mennie kell:
              pl:
              public abstract class allat {
              public void eszik() {
              //… állateszik…
              }
              }

              public interface harcos {
              public void harap();
              public void karmol();
              }

              public interface szelid {
              public void baratsagos();
              }

              class kutya extends allat implements harcos {
              public void eszik() {
              // … ez már kutyaeszikeszik, megint csak futás idõben…
              }
              }
              class vadmacska extends allat implements harcos…
              class hazimacska extends allat implements szelid…

              Szóval szerintem ennek a struktúrának elegendõnek kell lennie… 🙂 (Talán segített ez a kis példa.)

              #2052974
              linuxforum
              Felhasználó

                Köszi szépen!
                Sajna a PHP-ban interface sincs. A super-nek van megfelelõje, de az is csak objektumokon mûködik, osztályfüggvényeken nem. 🙂
                Hát, mindegy. Lassan megbarátkoztam a helyzettel. … 🙂

                #2052975
                pointux
                Felhasználó

                  Pedig ennek a kódnak menni kell php alatt is (azt nem tudom ugyan, hogy milyen verzióval)… esküszöm tele van vele a net.
                  (Egyébként, ha mégsem – ami kizárt -, akkor miért ragaszkodsz a php-hez, van java? Vagy azzal nem lehet megoldani? Vagy frissíteni kéne.)

                  „A super-nek van megfelelõje, de az is csak objektumokon mûködik, osztályfüggvényeken nem”
                  Persze annak az a lényege, hogy a szülõ ugyanolyan nevû függvényét el lehessen érni…

                  #1882703
                  csaba
                  Felhasználó

                    Egy objektumorientált programba többszörös öröklõdésre lenne szükségem, amit persze nem tud a nyelv.
                    Hogyan lehetne szépen, korrektül megoldani?
                    A helyzet:
                    Van egy A osztályom. Ebbõl származik rengeteg A1, A2, A3, … osztály. Továbbá van egy új B osztályom, melynek szeretném, ha ugyanazon leszármazottai meglennének, mint A-nak. B leszármaztatható A-ból, de semelyik Ax-bõl. B csak A némely metódusát definiálja felül, és ezeket kellene csak felüldefiniálni minden más A-ból származóban is.
                    Kényszerbõl delegálással próbálkoztam, de az sem tûnik jó megoldásnak, ugyanis a felüldefiniált mûveletek nem zártak, azaz más metódusokat használnak, melyeket B nem definiál felül, tehát mindig az aktuális objektum mûvelete kellene, hogy lefusson.

                  8 bejegyzés megtekintése - 1-8 / 8
                  • Be kell jelentkezni a hozzászóláshoz.