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 vaikuttivat kokonaisluku-, merkki- ja merkkijonotyyppien ryhmiin, jotka alettiin jakaa kahteen luokkaan:
Katso Liitännät: Delphi
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 ;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 ;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).
VarianttityyppiObject 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ää:
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 ParametritTuli 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äminenMerkkijono 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.
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 muutoksistaTurbo 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-ohjelmointiOminaisuuden 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.
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 >;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 ;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).
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 PascalFree 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 .Pascal | |||||||
---|---|---|---|---|---|---|---|
Murteet |
| ||||||
Kääntäjät |
| ||||||
IDE | |||||||
Henkilöt |