http://www.adaconcept.com/programs/ontozorendszeres_szimulacio/szimulacio-ontozorendszer-elemek.ads
with Szimulacio.Ontozorendszer.Megjelenito;
with Szimulacio.Ontozorendszer.Terv;

package Szimulacio.Ontozorendszer.Elemek is

   package Megjelenito renames Szimulacio.Ontozorendszer.Megjelenito;  --| atnevezesek, segitsegukkel sokkal rovidebb lehet a kodunk
   package Terv        renames Szimulacio.Ontozorendszer.Terv;         --| nagyon figyeljunk ra, hogy kovetkezetesen hasznaljuk az elnevezeseket, mert hamar komoly felreertesekhez vezethet a hasznalatuk


   procedure Letrehozas;
   procedure Inicializalas;
   procedure Frissites;


   type Megjelenitheto_Absztrakt_Tipus is abstract tagged null record;                                                                                         --| kell lennie egy kozos osnek
   function Megjelenit(Objektum : Megjelenitheto_Absztrakt_Tipus) return Megjelenito.String_Tomb_Tipus;                                                        --| Egy absztrakt tipus konkret muveletel. Ha valamelyik leszarmazott nem irja felul, akkor ez fog lefutni.
   function Megjelenit_Hivas_Dinamikus_Kotessel(Objektum : Megjelenitheto_Absztrakt_Tipus'Class) return Megjelenito.String_Tomb_Tipus;                         --| Ezzel a muvelettel valasztjuk ki futasi idoben a megjelenitendo objektumpeldany tipusahoz tartozo Megjelenit fuggvenyt.

   type Megjelenitheto_Absztrakt_Mutato_Tipus is access constant Megjelenitheto_Absztrakt_Tipus;                                                               --| konstans mutato tipus egy absztrakt tipusra


   type Frissitheto_Absztrakt_Tipus is abstract new Megjelenitheto_Absztrakt_Tipus with null record;
   procedure Inicializal(Objektum : in out Frissitheto_Absztrakt_Tipus);
   procedure Frissit(Objektum : in out Frissitheto_Absztrakt_Tipus) is abstract;                                                                               -- absztrakt tipus absztrakt muvelete, kotelezo felulirni, egy esetleges dinamikus kotessel igy biztosan egy implementalt eljarast hivunk majd meg


   type Frissitheto_Absztrakt_Ontozorendszer_Elem_Tipus is abstract new Frissitheto_Absztrakt_Tipus with private;


   function Vizforrastol_Mert_Tavolsag(Objektum : Frissitheto_Absztrakt_Ontozorendszer_Elem_Tipus) return Natural;                                             -- az absztrakt tipusnak (osztalynak) is lehetnek es most vannak is mezoi


   type Frissitheto_Absztrakt_Ontozorendszer_Elem_Osztaly_Mutato_Tipus is access all Frissitheto_Absztrakt_Ontozorendszer_Elem_Tipus'Class;                    -- az osztalyszintu tipus indefinit, ezert is hasznalunk mutatot...

   subtype Ontozorendszer_Elemek_Tomb_Index_Tipus is Positive range 1 .. Kert.Kert_Szelesseg * Kert.Kert_Hosszusag * 2 - 1;                                    -- "a valosagban ezt sokszor jobban felulrol becsulnenk"

   type Ontozorendszer_Elemek_Tomb_Tipus is array(Ontozorendszer_Elemek_Tomb_Index_Tipus) of Frissitheto_Absztrakt_Ontozorendszer_Elem_Osztaly_Mutato_Tipus;


   procedure Frissit_Hivas_Dinamikus_Kotessel(Objektum : Frissitheto_Absztrakt_Ontozorendszer_Elem_Osztaly_Mutato_Tipus);                                      -- tehat lehet (osztalyszintu) mutato parameteru metodus is, ami dinamikus hivast tartalmaz... (szandekosan nem a fenti ilyen fuggvenynek van mutato parametere :))

   -- Figyeljuk meg, hogy a hivas helyenel dol majd el, hogy dinamikus kotes tortenik vagy nem, nem itt dontunk rola!

private


   type Frissitheto_Absztrakt_Ontozorendszer_Elem_Tipus is abstract new Frissitheto_Absztrakt_Tipus with record
      Azonosito : Terv.Valodi_Reszletpont_Azonosito_Tipus;
      Vizforrastol_Mert_Tavolsag : Natural;
   end record;


end Szimulacio.Ontozorendszer.Elemek;