Objekti Pascal

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 1. huhtikuuta 2015 tarkistetusta versiosta . vahvistus vaatii 31 muokkausta .
Objekti Pascal
Kieliluokka olioohjelmointikieli , moniparadigmaohjelmointikieli , pakollinen ohjelmointikieli , strukturoitu ohjelmointikieli [d] ja ohjelmointikieli
Toteutustyyppi koottu
Esiintyi 1986
Kehittäjä Tesler, Larry ja Niklaus Wirth
Tiedostotunniste _ .p, .pptai.pas
Tyyppijärjestelmä staattinen , dynaaminen (joukko const, RTTI , Variant), tiukka
Tärkeimmät toteutukset Delphi ( x86 ja CLI ), Oxygene ( CLI ), Free Pascal ( x86 , x86-64 , PowerPC , ppc64 , SPARC ja ARM ), Virtual Pascal ( x86 ), TMT Pascal ( x86 ), Turbo51 ( Intel 8051 )
Murteet Apple, Turbo Pascal , objfpc, Delphi , Delphi.NET, Oxygene
Vaikutettu Pascal ja Smalltalk
vaikutti C# , Java , Nim

Object Pascal (  englanniksi  "  Object Pascal") on ohjelmointikieli , jonka Apple Computerissa vuonna 1986 kehitti Larry Tesler , joka konsultoi Niklaus Wirthiä [1] . Johdettu Pascalin [2] aiemmasta olioversiosta nimeltä Clascal , joka oli saatavilla Apple Lisa -tietokoneessa .

Muutokset Borlandin Object Pascalissa verrattuna Turbo Pascaliin

Muutokset vaikuttivat kokonaisluku-, merkki- ja merkkijonotyyppien ryhmiin, jotka alettiin jakaa kahteen luokkaan:

Liitännät

Katso Liitännät: Delphi

Menettelyn ja toiminnon ylikuormitus (ei-OOP)

Otettiin käyttöön proseduurien ja toimintojen ylikuormitus, jotka eivät ole objektin tai luokan jäseniä. Menettelyt ja toiminnot, jotka eroavat parametrien tyypeistä ja lukumäärästä, ovat ylikuormitettuja (käyttäen overload -avainsanaa):

menettely Calc ( I : Kokonaisluku ) ; ylikuormitus ; // ... menettely Calc ( S : String ; J : Integer ) ; ylikuormitus ;

Dynaaminen matriisi

Otettiin käyttöön poistamaan rutiinitoiminnot muistin varaamisesta ja palauttamisesta kasa-alueelle (keko) sekä satunnaisten virheiden ja muistivuotojen välttämiseksi. Matriisielementtien on oltava samaa tyyppiä. Elementtien numerointi alkaa nollasta.

Ilmoitusesimerkki:

var MyFlexibleArray : joukko Real ; _

Käyttö:

var A , B : kokonaislukujono ; _ _ begin SetLength ( A , 1 ) ; //Varaa muistia yhdelle elementille A [ 0 ] := 1 ; B := A ; B [ 0 ] := 2 ; loppu ;

Delphi XE7:n jälkeen seuraavat toiminnot dynaamisilla taulukoilla ovat tulleet mahdollisiksi:

var M : kokonaislukujono ; _ _ alkaa M := [ 1 , 2 , 3 , 4 , 5 ] ; loppu ; M : = M + [ 5 , 6 , 7 ] ; Insert ([ 6 , 7 , 8 ] , M , 5 ) ; // lisää taulukko [6, 7, 8] M:hen, alkaen indeksistä 5 Poista ( M , 1 , 3 ) ; // poista 3 elementtiä alkaen indeksistä 1 Concat ([ 1 , 2 , 3 , 4 ] , [ 5 , 6 , 7 ])

Eli voit työskennellä dynaamisten taulukoiden kanssa samalla tavalla kuin merkkijonojen kanssa.

Dynaamisessa taulukossa on mahdollista asettaa myös avoin parametrijoukko, mutta niiden tyyppi on ilmoitettava aikaisemmin, esim.

tyyppi TDynamicCharArray = Char - taulukko ; toiminto Etsi ( A : TDynamicCharArray ) : Kokonaisluku ;

Dynaaminen kirjoittaminen

Dynaamiset tyypin tarkistus- ja valuoperaattorit

Borlandin Object Pascal -kieli esitteli dynaamisen kirjoituksen sekä dynaamisen valuoperaattorin as- ja is - operaattorin dynaamiseen tyyppitarkistukseen. Lisäksi tuli mahdolliseksi välittää erityyppisiä parametreja avoimessa parametrijoukossa (variantti avoimen taulukon parametrit).

Varianttityyppi

Object Pascal -kieli esitteli muunnelman tietotyypin ( Variant ), jonka tyyppiä ei tunneta käännösvaiheessa ja joka voi muuttua ohjelman suoritusvaiheessa. Tämä tietotyyppi kuluttaa kuitenkin enemmän muistia kuin vastaavat muuttujat, ja toiminnot Varianttidatan kanssa ovat hitaampia. Lisäksi laittomat toiminnot tämän tyyppisillä tiedoilla johtavat usein virheisiin ohjelman suoritusvaiheessa, kun taas vastaavat virheet muun tyyppisissä tiedoissa havaittaisiin käännösvaiheessa.

Varianttimuuttujat voivat ottaa eri arvoja (kokonaisluku, merkkijono, looginen arvo, valuutta , OLE-merkkijonot), olla samantyyppisten elementtien taulukoita ja muunnelman tyyppisiä arvoja, ja ne voivat sisältää myös COM- ja CORBA-objekteja, joiden menetelmät ja ominaisuuksia voidaan käyttää tämän tyypin kautta. Variantti ei kuitenkaan voi sisältää:

  • rakennetyyppitiedot;
  • osoittimet;
  • Int64 (alkaen Delphi 6:sta - can).

Variantti voidaan sekoittaa (lausekkeissa ja lausekkeissa) muiden muunnelmien, numeeristen, merkkijono- ja boolen tietojen kanssa. Tässä tapauksessa kääntäjä suorittaa automaattisesti tyyppimuunnoksen. Merkkijonoja sisältäviä muunnelmia ei kuitenkaan voida indeksoida (V[i] ei ole sallittu).

var V1 , V2 , V3 , V4 , V5 : Variantti ; I : Kokonaisluku ; D : kaksinkertainen ; S : merkkijono _ aloita V1 := 1 ; //tyypin kokonaisluku V2 arvo := 35 9.768 ; //todellinen arvo V3 := 'Hei maailma!' ; //tyypin arvo merkkijono end ; Variant Open Array Type Parametrit

Tuli mahdolliseksi siirtää erityyppisiä parametreja. Alkuperäisessä tekstissä sitä kutsutaan "avoimen taulukon parametreiksi". Tietotyyppi määritetään dynaamisesti ohjelman suorituksen aikana. Aivan kuten tavallisessa avoimessa taulukossa, High-funktiota kutsutaan määrittämään taulukon elementtien lukumäärä. Ilmoitus käyttää avainsanoja array of const . Esimerkki:

toiminto Tulostus ( const Args : joukko const ) : merkkijono ; _ var I : Kokonaisluku ; alkaa Tulos := '' ; for I := 0 - High ( Args ) tehdä kanssa Args [ I ] do case Vt - merkkijonon tyyppi : Tulos := Tulos + VString ^; vtPChar : Tulos := Tulos + VPChar ; vtInteger : Tulos := Tulos + IntToStr ( VInteger ) ; vtBoolean : Tulos := Tulos + BoolToStr ( VBoolean ) ; vtChar : Tulos := Tulos + VChar ; vtExtended : Tulos := Tulos + FloatToStr ( VExtended ^ ) ; vtObject : Tulos := Tulos + VOobjekti . Luokan nimi ; vtClass : Tulos := Tulos + VClass . Luokan nimi ; vtVariant : Tulos := Tulos + merkkijono ( VVariant ^ ) ; vtInt64 : Tulos := Tulos + IntToStr ( VInt64 ^ ) ; vtAnsiString : Tulos := Tulos + merkkijono ( VAnsiString ) ; vtCurrency : Tulos := Tulos + CurrToStr ( VCurrency ^ ) ; loppu ; Tulos := Tulos + ' ' ; loppu ; //... Tulos ([ 'testi' , 777 , '@' , True , 3.14159 , TForm ]) ; //Avoimen parametrijoukon välittäminen

Merkkijono palautetaan: "test 777 @ T 3.14159 TForm".

Kuten näet, sillä on oma sisäinen rakenne, johon vetoaminen mahdollistaa tietotyypin määrittämisen. Funktion kutsuriville luodaan taulukko avoimen taulukon rakentajalla , joka käyttää hakasulkeita.

Erot kohdemalleissa

Uuden objektimallin käyttöönottamiseksi otetaan käyttöön luokan avainsana ( Turbo Pascalissa objektiavainsana ).

Operaattorit on otettu käyttöön tarkistamaan ja lähettämään is- ja luokkia dynaamisesti ohjelman suorittamisen aikana. Menetelmäosoittimia on ilmestynyt, joille on otettu käyttöön uusi objektiavainsanan käyttö :

tyyppi TMyMethod = objektin menettely ( Lähettäjä : Objekti ) ; _ Syntaksimuutokset kohteen sijoittelun muutoksista

Turbo Pascalissa oli mahdollista työskennellä sekä dynaamisten että staattisten esineiden kanssa.

Object Pascal -objektimallissa ohjelmoija toimii vain kasa-alueelle (keon) allokoitujen luokkien dynaamisten esiintymien kanssa. Tässä suhteessa objektien kenttiin ja menetelmiin pääsyn syntaksia on muutettu.

Aiemmin dynaamisten objektiinstanssien kanssa, jotka oli alustettu rakentajan käyttöoikeuksilla yhdessä New -funktion kanssa , piti käyttää osoitinkäyttöä (^). Nyt luokkatyypistä on tullut myös oletusarvoisesti osoitin.

Esimerkki vertailuksi:

Objektimalli Turbo Pascalissa :

kirjoita PMyObject = ^ TMyObject ; TMyObject = objekti ( TObject ) MyField : PMyType ; rakentaja Init ; loppu ; //... var MyObject : PMyObject ; begin MyObject := Uusi ( PMyObject , Init ) ; Oma esine ^. MyField := //... end ;

Uusi objektimalli Object Pascalissa :

tyyppi TMyObject = luokka ( TObject ) Oma kenttä : TMyType ; rakentaja Luo ; loppu ; //... var MyObject : TMyObject ; begin MyObject := TMyObject . luoda ; OmaObject . MyField := //... end ;

Rakentajien ja tuhoajien nimeämiskäytäntö on muuttunut. Vanhassa objektimallissa Uuden kutsuminen vastasi muistin varaamisesta ja konstruktorin kutsuminen alustai varatun muistialueen. Uudessa mallissa nämä toiminnot suorittaa Luo -konstruktori . Delphi XE -versiosta lähtien staattiset luokkamenetelmät ilmestyivät. [3]

Nyt on mahdollista rajoittaa luokkajäsenten näkyvyyttä (metodeja, ominaisuuksia), jotka on tarkoitettu käytettäväksi vain johdettujen luokkien toteutuksessa. Tämä mahdollistaa lähdekoodin suojaamisen luokan käyttäjien muutoksilta. Tällaiset menetelmät sisältyvät luokkailmoituksen suojattuun osioon .

Visuaalinen olio-ohjelmointi

Ominaisuuden käsitteet ( property ) ja omaisuuteen liittyvät avainsanat lue , kirjoitus , tallennettu , oletus ( nodefault ), indeksi . IDE :ssä näkyvien visuaalisten objektien ominaisuudet ilmoitetaan käyttämällä uutta sanaa , joka on julkaistu visuaalisen objektin luokan ilmoituksessa.

Yleistykset

tyyppi {ilmoitus} yleinen TList < T > = luokka Alkiot : T - joukko ; menettely Lisää ( Arvo : T ) ; loppu ; toteutus {toteutus} -menettely TList . Lisää ( Arvo : T ) ; begin SetLength ( Items , Length ( Items ) + 1 ) ; Kohteet [ pituus ( kohteita ) - 1 ] := Arvo ; loppu ;

Yleinen luokka voidaan yksinkertaisesti erikoistua tiettyyn tyyppiin käyttämällä erikoistumisavainsanaa :

kirjoita TIntegerList = erikoistua TList < Kokonaisluku >; TPointerList = erikoistua TList < Osoitin >; TStringList = erikoistua TList < merkkijono >;

Operaattorin ylikuormitus

TMT Pascalin (Object Pascalin muunnos) kehittäjät ottivat ensimmäisenä käyttöön täysimittaisen operaattorin ylikuormituksen , jonka myöhemmin omaksuivat muiden kielen murteiden kehittäjät: Delphi (vuodesta 2005 Delphi), Free Pascal jne.

Esimerkki:

{ilmoitus} tyyppi TVector = pakattu tietue A , B , C : Double ; menettely From ( const A , B , C : Double ) ; luokan operaattori Lisää ( jatk . Vasen , Oikea : TVector ) : TVector ; luokan operaattori Implisiitti ( const v : TVector ) : TPoint ; loppu ; {toteutus} toteutus //... luokan operaattori TVector . Lisää ( jatkuu Vasen , Oikea : TVector ) : TVector ; aloitustulos . _ A := Vasen . A + oikea . A ; tulos . B := Vasen . B + Oikea . B ; tulos . C := Vasen . C + Oikea . C ; loppu ; luokan operaattori TVector . Implisiitti ( const v : TVector ) : TPoint ; aloitustulos . _ A := pyöreä ( v . A ) ; tulos . B := pyöreä ( v . B ) ; loppu ; //... {usage} var v1 , v2 : TVector ; aloita v1 . Alkaen ( 20 , 70 , 0 ) ; v2 . Alkaen ( 15 , 40 , 4 ) ; kankaalle . monikulmio ([ v1 , v2 , v1 + v2 ]) ; loppu ;

Eri kehittäjien tuki

Delphi 7:stä lähtien Borland nimesi Object Pascalin virallisesti Delphiksi [4] .

Object Pascal -kieltä ylläpitävät ja kehittävät muut kehittäjät. Object Pascalin vakavimmat toteutukset (Delphin lisäksi) ovat monikielisen ympäristön TopSpeed ​​​​, TMT Pascal , Virtual Pascal , PascalABC.NET , Free Pascal , Free Pascal, monikielinen TopSpeed ​​​​Pascal (Turbo Pascal -kieliversio [5] ) , GNU Pascal . Oxygene - ohjelmointikieli on Object Pascalin murre .NET-alustalle ja sen jatkokehitykseen, ja uusia kielen ominaisuuksia ovat ":"-operaattori, asynkroniset ja viivästyt menetelmäkutsut, asynkroninen koodilohkon suoritus, rinnakkaissilmukat, anonyymit konstruktorit, elementit sopimus- ja aspektisuuntautunut ohjelmointi ja muut [6] (kääntäjä jaetaan ilman rajoituksia).

Esimerkkejä Hello, world! » eri objektikielissä

Applen Object Pascal ohjelma ObjectPascalExample ; type THelloWorld = objektiproseduuri Put ; _ loppu ; var HelloWorld : THelloWorld ; menettely THelloWorld . laittaa ; begin WriteLn ( 'Hei, maailma!' ) ; loppu ; AloitaUusi ( HelloWorld ) ; _ helloworld . laittaa ; Hävitä ( HelloWorld ) ; loppua . TurboPascal

Delphi (taaksepäin yhteensopivuus) ja Free Pascal tukevat myös tätä syntaksia.

ohjelma ObjectPascalExample ; typePHelloWorld = ^ THelloWorld ; _ THelloWorld = objektiproseduuri Put ; _ loppu ; var HelloWorld : PHelloWorld ; { on osoitin THelloWorldiin } menettely THelloWorld . laittaa ; begin WriteLn ( 'Hei, maailma!' ) ; loppu ; AloitaUusi ( HelloWorld ) ; _ helloworld ^. laittaa ; Hävitä ( HelloWorld ) ; loppua . Delphi ja Free Pascal

Free Pascalissa tämä syntaksi on käytettävissä ObjFpc- ja Delphi -tiloissa . [7]

ohjelma ObjectPascalExample ; tyyppi THelloWorld = luokka { luokan määritelmä } menettely Put ; loppu ; menettely THelloWorld . laittaa ; { kuvaus THelloWorld-luokan Put-metodiproseduurista } begin Writeln ( 'Hei, maailma!' ) ; loppu ; var HelloWorld : THelloWorld ; { luokan esiintymän osoitinmuuttujan määritelmä } Aloita HelloWorld := THelloWorld . luoda ; { konstruktori palauttaa osoittimen arvon luokan esiintymään } HelloWorld . laittaa ; helloworld . Ilmainen ; {destructor tuhoaa luokan ilmentymän ja vapauttaa muistialueen} end .

Muistiinpanot

  1. Tesler, Larry (1985). "Object Pascal -raportti". Strukturoitu kielimaailma . 9 (3): 10-7.
  2. Butch G. Olio-suuntautunut suunnittelu tapaustutkimuksilla K.: Dialektiikka; M.: Concord, 1992. - 519 s.
  3. Delphi XE:hen siirtymisen edut Mitä uutta Delphi 7:ään verrattuna Andreano Lanusse Arkistoitu 15. kesäkuuta 2016 Wayback Machinessa , marraskuu 2010 Embarcadero Technologies Venäjä, IVY
  4. Delphi Language Overview  (downlink)
  5. TopSpeed ​​​​Compilers: Didn't Liven to Triumph Arkistoitu 11. tammikuuta 2012.
  6. Remobjects Oxygene (downlink) . Käyttöpäivä: 16. marraskuuta 2015. Arkistoitu alkuperäisestä 17. marraskuuta 2015. 
  7. Michael Van Canneyt. Luku 6: Luokat  (englanti)  (downlink) . Free Pascal: Viiteopas. (joulukuu 2011). Käyttöpäivä: 16. tammikuuta 2012. Arkistoitu alkuperäisestä 2. helmikuuta 2012.