Utazás TObject
Utazás TObject. Vagy hogyan működik.
Utazás TObject. Vagy hogyan működik.
Minden osztály Delphi utóda TObject. és ennek megfelelően az összes tulajdonságok és módszerek. Ez kétségtelenül hasznos tény, de mik a módszerek és tulajdonságok, mik a főbb jellemzői, és hogyan kell használni őket? Mint később látni fogjuk, hogy ez nagyon sok végrehajtásában TObject célja Delphi objektum modell leírását.
Tekintsük a leírás részletesen.
Azonnal látható, hogy az osztály módszerek és a funkcionalitás, mint tudjuk, nem függ a létezését egy példányát. Nézzük részletesebben az egyes módszereket.
Csak szeretnék megemlíteni módszerek - konstruktorok és a destruktor valójában szereplők, azaz a belső, függetlenül azok végrehajtását a kódot konstrukciókat.
Minden objektum által létrehozott konstruktor hívást. Valójában a kivitelező nem köteles nevezhető létrehozása, csak azt, hogy elfogadta a módszer neve is. A kivitelező valójában egy osztály módszer. és a munkája során okozott az alábbi módszerekkel: Tény, hogy a kihívás ezeknek a módszereknek, elég érdekes. A TObject kivitelező nem végez semmilyen tevékenységet, azonban, mivel a gyökere az osztály hierarchia, akkor létrejön az RTM szinten. Mi történik? Miután felhívta a konstruktor NewInstance RTM eljárás, amely megállapítja a memória területhez, összhangban az értéket vmtInstanceSize, ami akkor keletkezik, a fordítás során. Belül hívás NewInstance hívás InitInstance, amely kitölti a mező módszer a jelzett értékek a módosító alapértelmezésben további, a kód le a szervezetben létrehozása eljárást (vagy az egyik, hogy a bejelentett konstruktor), akkor a vezérlés továbbítódik a ponttal a vmtAfterConstruction amely alapértelmezés szerint a AfterConstruction módszerrel. Mindezek a műveletek lehetővé teszik, hogy egyszerűsítse a létrehozásának folyamatában például egy rugalmas belül Delphi objektum modell. Így, ha létrehoz egy objektumpéldányt (tárgy), akkor „részt” annak bármelyik fázisában. Jelentés AfterConstruction eljárás az, hogy azonosítsa a végén a tervezési osztály. Könnyű használat az, hogy csak az úgynevezett siker designer, hogy tudja, elég nyereséges. A mai napig csak TCustomForm és TCustomDataModule terhelje ez a módszer kifejezetten az egyes feladataik ellátásához, akkor mi akadályoz bennünket nem ugyanaz? De ez egy kérdés tervezése egy osztály.
Mi történik abban az esetben, kivételes helyzetben a kivitelező? Fontos tudni, hogy az összes elemet az osztály jött létre, és tudjuk, hogy ha egy kivétel, akkor el lehet távolítani. Tehát, ha egy kivétel által okozott minden olyan tevékenységet, megsemmisítésével kapcsolatos - hívja fel a destruktor, mind-mind a teljes programot.
Fontos tudni, hogy az osztály konstruktora hívják hívják, mint a kivitelező, valamint létrehoz egy példányt, ha hívja a kivitelező az objektum nevezzük azt az eljárást, és nem hoz létre új példányt, innen kapják kezdete következő típusú hiba:
Amikor hívja az objektum konstruktor eljárás Fontos megjegyezni, hogy ha a tárgyak jönnek létre a kivitelező a területen, hogy itt van egy potenciális kockázat a memóriavesztés, az új példányok jönnek létre, és régiek nem pusztulnak.
Ez az eljárás kezdeményezi a pusztító folyamat az objektum a memóriában. Miért nem a destruktor? Destructor kihívás megfelelő kiadási források feldolgozására elavult objektum meghatározás objektumot. Ha megnézzük, milyen módon ez az eljárás működik, akkor láthatjuk, egy érdekes kép.
Mit látunk? Az első sorban van egy levezetését a mutatót a Self (self) nulla - és ha még nem megjelent? Ha még nem, akkor rendre az index vmtDestroy hívjuk valódi destructor. Ellenkező esetben az eljárás kilép. Tehát van egy triviális „check bolond” az RTM Delphi. Amikor felhívja a destruktor mi most megjelent (vagy nem mentesített, és hiába) objektumot források. Ismét során a felszabadulás források elvégzésére a teljes körű intézkedéseket. FreeInstance eljárás hatására a lépcsőzetes célzó eljárások a felszabadulás az összes megszállt források, beleértve a dinamikus tömböket, egy Variant típusú, és így tovább. Ez hasznos lehet abban az esetben, kivételes körülmények a kivitelező a már kialakított belső dinamikus struktúrák. Az is nagyon hasznos, mint egy mechanizmust szemétgyűjtő az objektumot.
osztályú funkció InitInstance (Bíróság: Pointer): TObject;
Az inicializálási funkció másolatok információkat VMT, figyelmet kell fordítani a használatát interfész örökséget. Fontos megjegyezni, hogy ez a funkció az osztály, sőt, ez a függvény kitölti az üres tárgy, hozzon létre egy függvényt NewInstance.
Hogy visszatérjen egy például egy „szűz” tartalom. Ez használ a tárolt adatok vmtInitTable és vmtParent.
Funkció ClassType: TClass;
Visszaadja az osztály az objektum. Hogy pontosabbak legyünk, azt vissza közvetlenül a mutatót VMT.
osztálymetódusként ClassName: ShortString;
Visszaadja az osztály neve. Használt VMT.
osztálymetódusként ClassNameIs (const Név: string): Boolean;
Elvégzi ellenőrzését nevét az a kívánt osztályban. Akkor alkalmazzák, ha az üzemeltető.
osztálymetódusként ClassParent: TClass;
Egy pointert ad a szülő osztályban. Akkor alkalmazzák, ha az üzemeltető.
osztálymetódusként ClassInfo: Pointer;
Visszaad egy pointert a RTTI információkat az osztályban. Ha az osztály össze nélkül irányelvek $ M +, visszatér nulla.
osztálymetódusként InstanceSize: Longint;
eset méret. Mint látható a leírást az információkat a méret és RTTI tárolja a VMT van kötve egy konkrét esetben. Úgy látszik, ez az információ keletkezik fordításkor.
osztályú funkció InheritsFrom (AClass: TClass): Boole;
Visszaadja a pontos megjelölése, hogy ez az osztály örökli a címet. Ez a funkció ellenőrzi a VMT és a szülők a VMT, hogy megfeleljen az adott osztály.
osztályú funkció MethodAddress (const Név: ShortString): Pointer;
osztálymetódusként MethodName (Cím: Pointer): ShortString;
Az inverz az előzőt.
Funkció FieldAddress (const Név: ShortString): Pointer;
Hozzáférés a területeken. Visszaad egy pointert a területen. Mint mindig használ VMT.
Funkció GetInterface (const IID: TGUID; out Obj): Boole;
Használja öröklése interfészek és interfész visszatér jelzik IID.
osztályú funkció GetInterfaceEntry (const IID: TGUID): PinterfaceEntry;
Visszaadja a felület belépési pontja a megadott IID.
osztálymetódusként GetInterfaceTable: PInterfaceTable;
Táblázat interfészek. Annak ellenére, hogy az igényelt alkalmazása végtelen számú interfész a forrás világosan fel van tüntetve a 10000 felület elemeit táblázatban. Persze, nem akarom, hogy hozzon létre egy kísérletet, és kipróbálni, hogy meghaladja ezt a határt, de az előrehaladás olyan ütemben, hogy attól félek, egy idő után ez a korlát elérésekor.
Funkció SafeCallException (ExceptObject: TObject; ExceptAddr: Pointer): HRESULT; virtuális;
Eljárás AfterConstruction; virtuális;
Eljárás BeforeDestruction; virtuális;
Szokásos, az úgynevezett elpusztítása előtt a tárgy.
Eljárás Dispatch (var Message); virtuális;
Mivel a használata a Windows, mint az alapul szolgáló platform, a fejlesztők úgy döntött, hogy nem adja át a fő módszer a feldolgozás objektumok között - üzenetküldő rendszer. Ezt a módszert csak hajtják végre ezzel a módszerrel. nem ésszerűtlen, hogy azt pontosan TObject, mert ez az alapja az összes osztályok belül meghatározott Delphi objektum modell. Ez a módszer ellenőrzi a jelenlétét VMT üzenetkezelő, melynek azonosító megadva az első 4 bájt (hosszú szó, bíboros) Üzenet paramétert és ha nem találja, az ok DefaultHandler. Lehetőség van, hogy utolérjék a zajló események nem csak a kontroll, hanem az alsóbb osztályok a hierarchia.
Eljárás DefaultHandler (var Message); virtuális;
Az alapértelmezett eseménykezelő. Úgynevezett Dispatch módszer nem állapította meg a felvezető módszer megfelelő üzenetet.
osztálymetódusként NewInstance: TObject; virtuális;
Ez létrehoz egy példányát az osztályban. Célszerű ezt a szolgáltatást használni, hogy a klón tárgyakat, mert anélkül, hogy tudnánk az eredeti osztály, akkor új példányait kész tárgyak használata nélkül RTTI.
eljárás FreeInstance; virtuális;
Felszabadítja egy példánya források. Ezzel a módszerrel nem ajánlott, mert a szoros kapcsolatot a VMT, azaz túlterhelés ezt a módszert kell elvégezni nagy körültekintéssel. Felhívás a módszer közvetlenül együtt InitInstance szolgálhat, hogy hozzon létre egy példánya „önmagában”, mert bizonyos feladatokat igényel visszaállítását állapota az objektum idején teremtés.
destructor elpusztítani; virtuális;
Tulajdonképpen destruktor. Hívják a Free miután megbizonyosodott arról, hogy a példány hiszen. Van egy pont, elnevezési destruktor - meg kell nevezni a Destroy, ez annak köszönhető, hogy a virtualitás, és így a túlterhelés. Ha hívja a destruktor egy másik nevet, majd amikor megpróbálja felhívni az örökölt RTM eljárás megállapítja eljárás leírását az Ön nevét, és ez maga után vonná az sérti a funkcionalitás a tárgy megsemmisítési eljárásokkal. Ugyanakkor érdemes megjegyezni, egy részlet. A rendelkezésre álló hívja az örökölt destruktor nem szükséges, bár kívánatos - mivel nem minden fejlesztő szeretnek kezelni futásidejű eseményeinek és engedje memória mennyiségét például megtörténhet részvétele nélkül a kód leírt destruktor.
Ennek eredményeként a tanuló a forráskódot egy érdekes pillanat - bármilyen módszerrel EAX egy mutató a VMT ...! Ez nem egy egyértelmű jelzés az objektum orientáció Delphi. Tanulmányozva anyagok a könyv „Delphi dióhéjban” Lishnera Ray (Ray Lischner) rábukkantam egy érdekes tény - összehasonlító táblázat objektum modell egyes nyelvek, hadd vigye magával néhány fordítás és kiegészítésekkel:
Támogatott funkciók objektum modell valamilyen programozási nyelven.