Pascal objektum

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2015. április 1-jén felülvizsgált verziótól ; az ellenőrzéshez 31 szerkesztés szükséges .
Pascal objektum
Nyelvóra objektumorientált programozási nyelv , többparadigmás programozási nyelv , kötelező programozási nyelv , strukturált programozási nyelv [d] és programozási nyelv
A végrehajtás típusa összeállított
Megjelent 1986
Fejlesztő Tesler, Larry és Niklaus Wirth
Fájlkiterjesztés _ .p, .ppvagy.pas
Típusrendszer static , dynamic (array of const, RTTI , Variant), szigorú
Főbb megvalósítások Delphi ( x86 és CLI ), Oxygene ( CLI ), Free Pascal ( x86 , x86-64 , PowerPC , ppc64 , SPARC és ARM ), Virtual Pascal ( x86 ), TMT Pascal ( x86 ), Turbo51 ( Intel 8051 )
Dialektusok Apple, Turbo Pascal , objfpc, Delphi , Delphi.NET, Oxygene
Befolyásolva Pascal és Smalltalk
befolyásolta C# , Java , Nim

Az Object Pascal (  angolul  -  "Object Pascal") egy programozási nyelv , amelyet 1986 -ban az Apple Computernél fejlesztettek ki Larry Tesler csoportja által , akik Niklaus Wirth -tel [1] konzultáltak . A Pascal [2] korábbi Clascal nevű , objektumorientált verziójából származik , amely elérhető volt az Apple Lisa számítógépen .

Változások a Borland Object Pascalban a Turbo Pascalhoz képest

A változások az egész számok, karakterek és karakterláncok csoportjait érintették, amelyeket két kategóriába soroltak:

Interfészek

Lásd Interfészek: Delphi

Eljárás és funkció túlterhelése (nem OOP)

Olyan eljárások és funkciók túlterhelését vezették be, amelyek nem tagjai egy objektumnak vagy osztálynak. A típusban és a paraméterek számában eltérő eljárások és funkciók túlterheltek (az overload kulcsszó használatával):

eljárás Calc ( I : Integer ) ; túlterhelés ; // ... eljárás Calc ( S : String ; J : Integer ) ; túlterhelés ;

Dinamikus tömb

Azért vezették be, hogy kiküszöböljék a memória halomterületre (heap) történő lefoglalásának és visszaküldésének rutinműveleteit, és elkerüljék a véletlenszerű hibákat és a memóriaszivárgást. A tömbelemeknek azonos típusúaknak kell lenniük. Az elemszámozás nullától kezdődik.

Példa a nyilatkozatra:

var MyFlexibleArray : Real tömbje ; _

Használat:

var A , B : egész számok tömbje ; begin SetLength ( A , 1 ) ; //Memória lefoglalása egy elemhez A [ 0 ] := 1 ; B := A ; B [ 0 ] := 2 ; vége ;

A Delphi XE7 óta a következő műveletek váltak lehetővé dinamikus tömbökkel:

var M : egész számok tömbje ; kezdődik M := [ 1 , 2 , 3 , 4 , 5 ] ; vége ; M : = M + [ 5,6,7 ] ; _ _ _ Beszúrás ([ 6 , 7 , 8 ] , M , 5 ) ; // tömb [6, 7, 8] beszúrása M-be, az 5-ös indextől kezdve Törlés ( M , 1 , 3 ) ; // 3 elem eltávolítása az 1 indextől kezdődően Concat ([ 1 , 2 , 3 , 4 ] , [ 5 , 6 , 7 ])

Vagyis dinamikus tömbökkel ugyanúgy lehet dolgozni, mint karakterláncokkal.

Dinamikus tömbben lehetőség van nyílt paramétertömb beállítására is, de ezek típusát korábban kell deklarálni, pl.

type TDynamicCharArray = Char tömbje ; _ függvény Keresés ( A : TDynamicCharArray ) : Integer ;

Dinamikus gépelés

Dinamikus típusellenőrző és casting operátorok

A Borland Object Pascal nyelve bevezette a dinamikus gépelést , valamint a dinamikus típusellenőrzéshez a dinamikus öntés operátort as és az is operátort. Ezenkívül lehetővé vált különféle típusú paraméterek átadása egy nyílt paramétertömbben (nyílt tömb paramétereinek változata).

Változat típusa

Az Object Pascal nyelv egy variáns adattípust ( Variant ) vezetett be, amelynek típusa a fordítási szakaszban nem ismert, és a program végrehajtási szakaszában változhat. Ez az adattípus azonban több memóriát fogyaszt, mint a megfelelő változók, és a Variant adatokkal végzett műveletek lassabbak. Ezen túlmenően az ilyen típusú adatokkal végzett illegális műveletek gyakran hibákhoz vezetnek a program végrehajtási szakaszában, míg más típusú adatokkal kapcsolatos hasonló hibákat a fordítási szakaszban észlelik.

A változatváltozók különböző értékeket vehetnek fel (egész szám, karakterlánc, logikai érték, pénznem , OLE karakterláncok), lehetnek azonos típusú elemek tömbjei és a változat típusú értékek tömbje, valamint COM és CORBA objektumokat is tartalmazhatnak, amelyek metódusai és a tulajdonságok ezen a típuson keresztül érhetők el. Egy Változat azonban nem tartalmazhatja:

  • szerkezeti típus adatok;
  • mutatók;
  • Int64 (Delphi 6-tól kezdve - can).

A változat keverhető (kifejezésekben és utasításokban) más változatokkal, numerikus, karakterlánc- és logikai adatokkal. Ebben az esetben a fordító automatikusan típuskonverziót hajt végre. A karakterláncokat tartalmazó változatok azonban nem indexelhetők (a V[i] nem megengedett).

var V1 , V2 , V3 , V4 , V5 : Változat ; I : Integer ; D : dupla ; S : String_ _ kezdődik V1 := 1 ; //integer típus értéke V2 := 35 9,768 ; //valós érték V3 := 'Hello world!' ; //típus értéke string end ; Variant Open Array Type Parameters

Lehetővé vált különféle típusú paraméterek átvitele. Az eredetiben "változat nyílt tömb paramétereinek" nevezik. Az adattípus a program végrehajtása során dinamikusan kerül meghatározásra. Csakúgy, mint egy normál nyílt tömbben, a High függvényt hívják meg a tömbelemek számának meghatározására. A deklaráció az array of const kulcsszavakat használja . Példa:

function Kimenet ( const Args : const tömbje ) : string ; _ var I : Integer ; kezdődik Eredmény := '' ; for I := 0 to High ( Args ) do with Args [ I ] do case VtString típusa : Eredmény := Eredmény + VString ^ ; vtPChar : Eredmény := Eredmény + VPChar ; vtInteger : Eredmény := Eredmény + IntToStr ( VInteger ) ; vtBoolean : Eredmény := Eredmény + BoolToStr ( VBoolean ) ; vtChar : Eredmény := Eredmény + VChar ; vtExtended : Eredmény := Eredmény + FloatToStr ( VExtended ^ ) ; vtObject : Eredmény := Eredmény + VObject . Osztálynév ; vtClass : Eredmény := Eredmény + VClass . Osztálynév ; vtVariant : Eredmény := Eredmény + karakterlánc ( VVariant ^ ) ; vtInt64 : Eredmény := Eredmény + IntToStr ( VInt64 ^ ) ; vtAnsiString : Eredmény := Eredmény + karakterlánc ( VAnsiString ) ; vtCurrency : Eredmény := Eredmény + CurrToStr ( VCurrency ^ ) ; vége ; Eredmény := Eredmény + ' ' ; vége ; //... Kimenet ([ 'teszt' , 777 , '@' , Igaz , 3.14159 , TForm ]) ; //paraméterek nyílt tömbjének átadása

A karakterlánc visszaadása: "test 777 @ T 3.14159 TForm".

Mint látható, saját belső struktúrája van, amelyre való hivatkozás lehetővé teszi az adattípus meghatározását. Egy tömb jön létre a függvényhívási sorban a nyílt tömb konstruktor segítségével , amely szögletes zárójeleket használ.

Különbségek az objektummodellek között

Egy új objektummodell bevezetéséhez bevezetjük az osztály kulcsszót ( Turbo Pascalban az objektum kulcsszó ).

Bevezették az operátorokat az is és as osztályok dinamikus ellenőrzésére és leadására a program végrehajtása során. Megjelentek a metódusmutatók, amelyekhez az objektum kulcsszó új használata került bevezetésre :

típus TMyMethod = objektum eljárása ( Feladó : Objektum ) ; _ Szintaktikai változások az objektumok elhelyezésében bekövetkezett változások miatt

A Turbo Pascalban dinamikus és statikus objektumpéldányokkal is lehetett dolgozni.

Az Object Pascal objektummodellben a programozó csak a kupacterületen (heap) lefoglalt osztályok dinamikus példányaival dolgozik. Ebben a tekintetben az objektumok mezőihez és metódusaihoz való hozzáférés szintaxisa megváltozott.

Korábban a konstruktor hozzáféréssel inicializált dinamikus objektumpéldányok használatához az Új függvénnyel kombinálva mutató (^) hozzáférést kellett használnia . Most már az osztálytípus is alapértelmezés szerint mutató lett.

Példa összehasonlításra:

Objektummodell Turbo Pascalban :

írja be: PMyObject = ^ TMyObject ; TMyObject = objektum ( TObject ) Saját mező : PMyType ; kivitelező Init ; vége ; //... var MyObject : PMyObject ; begin MyObject := Új ( PMyObject , Init ) ; Saját objektum ^. MyField := //... vége ;

Új objektummodell az Object Pascalban :

típus TMyObject = osztály ( TObject ) MyField : TMyType ; konstruktor Create ; vége ; //... var MyObject : TMyObject ; begin MyObject := TMyObject . létrehozni ; MyObject . MyField := //... vége ;

A konstruktorok és a destruktorok elnevezési konvenciója megváltozott. A régi objektummodellben az Új hívása felelt a memória lefoglalásáért, a konstruktor meghívása pedig inicializálta a lefoglalt memóriaterületet. Az új modellben ezeket a műveleteket a Create konstruktor hajtja végre . A Delphi XE verziójától kezdve megjelentek a statikus osztálymetódusok. [3]

Mostantól lehetőség van az osztálytagok (metódusok, tulajdonságok) láthatóságának korlátozására, amelyek csak származtatott osztályok megvalósítására szolgálnak. Ez lehetővé teszi a forráskód védelmét az osztály felhasználói általi módosításoktól. Az ilyen metódusokat az osztálydeklaráció védett része tartalmazza.

Vizuális objektum-orientált programozás

A property ( property ) fogalmak és a tulajdonhoz kapcsolódó kulcsszavak read , write , stored , default ( nodefault ), index . Az IDE -ben látható vizuális objektumok tulajdonságait a vizuális objektum osztály deklarációjában szekcióként közzétett új szó használatával deklarálják .

Általánosítások

type {declaration} generic TList < T > = class Items : array of T ; eljárás Add ( Érték : T ) ; vége ; implementáció {implementation} eljárás TLista . Add ( Érték : T ) ; begin SetLength ( Items , Length ( Items ) + 1 ) ; Elemek [ Hossz ( Tételek ) - 1 ] := Érték ; vége ;

Egy általános osztály egyszerűen specializálható egy adott típusra a specialize kulcsszó használatával :

type TIntegerList = speciale TList < Integer > ; TPointerList = specializálódás TList < Mutató >; TStringList = specializálódás TList < string >;

Kezelői túlterhelés

A TMT Pascal (az Object Pascal egy módosítása) fejlesztői voltak az elsők, akik bevezették a teljes értékű operátor túlterhelést , amelyet később a nyelv más dialektusainak fejlesztői is átvettek: Delphi (2005 óta Delphi), Free Pascal stb.

Példa:

{deklaráció} típus TVector = csomagolt rekord A , B , C : Double ; eljárás From ( konst A , B , C : Double ) ; osztály operátor Add ( const Bal , Jobb : TVector ) : TVector ; osztály operátor Implicit ( const v : TVector ) : TPoint ; vége ; {implementation} implementáció //... osztály operátor TVector . Add ( konst Balra , Jobbra : TVector ) : TVector ; kezdő Eredmény . _ A := Balra . A + Jobb . A ; eredmény . B := Balra . B + Jobb . B ; eredmény . C := Balra . C + Jobb . C ; vége ; osztályú operátor TVektor . Implicit ( const v : TVector ) : TPoint ; kezdő Eredmény . _ A := kerek ( v . A ) ; eredmény . B := kerek ( v . B ) ; vége ; //... {usage} var v1 , v2 : TVector ; kezdődik v1 . innen ( 20 , 70 , 0 ) ; v2 . -tól ( 15 , 40 , 4 ) ; vászon . Sokszög ([ v1 , v2 , v1 + v2 ]) ; vége ;

Különféle fejlesztők támogatása

A Delphi 7-től kezdve a Borland hivatalosan is Delphi - nek nevezte el az Object Pascalt [4] .

Az Object Pascal nyelvet más fejlesztők karbantartják és fejlesztik. Az Object Pascal legkomolyabb implementációi (a Delphi mellett) a többnyelvű TopSpeed , TMT Pascal , Virtual Pascal , PascalABC.NET , Free Pascal , többplatformos TopSpeed ​​Pascal (Turbo Pascal nyelvi változat [5] ) , GNU Pascal . Az Oxygene programozási nyelv az Object Pascal dialektusa a .NET platformra és annak továbbfejlesztésére, új nyelvi funkciók pedig a ":" operátor, az aszinkron és halasztott metódushívások, aszinkron kódblokk-végrehajtás, párhuzamos hurkok, névtelen konstruktorok, szerződés- és szempont-orientált programozás és egyebek [6] (a fordító korlátozás nélkül terjesztve).

Példák a Hello, world! » különböző objektumnyelv-kiterjesztésekben

Object Pascal az Apple-től program ObjectPascalExample ; type THelloWorld = objektum eljárás Put ; vége ; var HelloWorld : THelloWorld ; eljárás THelloWorld . tegye ; begin WriteLn ( 'Hello, World!' ) ; vége ; kezdőújság ( HelloWorld ) ; _ helloworld . tegye ; Dispose ( HelloWorld ) ; vége . TurboPascal

A Delphi (a visszafelé kompatibilitás érdekében) és a Free Pascal is támogatja ezt a szintaxist.

program ObjectPascalExample ; typePHelloWorld = ^ THelloWorld ; _ THelloWorld = objektum eljárás Put ; vége ; var HelloWorld : PHelloWorld ; { egy mutató a THelloWorld-re } eljárás THelloWorld . tegye ; begin WriteLn ( 'Hello, World!' ) ; vége ; kezdőújság ( HelloWorld ) ; _ helloworld ^. tegye ; Dispose ( HelloWorld ) ; vége . Delphi és Free Pascal

A Free Pascalban ez a szintaxis ObjFpc és Delphi módban érhető el . [7]

program ObjectPascalExample ; type THelloWorld = class { osztálydefiníció } procedúra Put ; vége ; eljárás THelloWorld . tegye ; { a THelloWorld osztály Put metódus eljárásának leírása } begin Writeln ( 'Hello, World!' ) ; vége ; var HelloWorld : THelloWorld ; { egy osztály példányára mutató mutatóváltozó meghatározása } kezdődik HelloWorld := THelloWorld . létrehozni ; { a konstruktor egy mutató értékét adja vissza az osztály egy példányára } HelloWorld . tegye ; helloworld . Ingyenes ; { destructor megsemmisíti az osztálypéldányt és felszabadítja a memóriaterületet } end .

Jegyzetek

  1. Tesler, Larry (1985). "Object Pascal jelentés". Strukturált nyelvi világ . 9 (3): 10-7.
  2. Butch G. Objektum-orientált tervezés esettanulmányokkal K.: Dialektika; M.: Concord, 1992. - 519 p.
  3. A Delphi XE-re való átállás előnyei Újdonságok a Delphi 7-hez képest Andreano Lanusse Archiválva : 2016. június 15. a Wayback Machine -nél , 2010. november Embarcadero Technologies Oroszország, FÁK
  4. Delphi nyelvi áttekintése  (lefelé hivatkozás)
  5. TopSpeed ​​​​Compilers: Didn't Live to Triumph Archiválva : 2012. január 11.
  6. Remobjects Oxygene (downlink) . Hozzáférés dátuma: 2015. november 16. Az eredetiből archiválva : 2015. november 17. 
  7. Michael Van Canneyt. 6. fejezet: Osztályok  (angol)  (downlink) . Free Pascal: Útmutató. (2011. december). Hozzáférés dátuma: 2012. január 16. Az eredetiből archiválva : 2012. február 2..