„Eiffel (programozási nyelv)” változatai közötti eltérés
[ellenőrzött változat] | [ellenőrzött változat] |
Tartalom törölve Tartalom hozzáadva
Nincs szerkesztési összefoglaló |
|||
36. sor:
Az Eiffel beépített elemi típusai:
<source lang="eiffel">
INTEGER, REAL, DOUBLE, CHARACTER, BOOLEAN.
</source>
A fordító ismeri még a <source lang="eiffel">STRING</source>, az <source lang="eiffel">ARRAY</source> és a <source lang="eiffel">BIT_N</source> (bitsorozat típus) típust is. Mindezek a típusok nullaszerű értékre inicializálódnak: az <source lang="eiffel">INTEGER 0</source>-ra, a <source lang="eiffel">REAL 0.0</source>-ra, a <source lang="eiffel">DOUBLE 0.0</source>-ra, a <source lang="eiffel">CHARACTER</source> nullkarakterre és a <source lang="eiffel">BOOLEAN False</source>-ra.
===Konvenciók===
Maga a nyelv
Az osztályok neve a konvenció szerint csupa nagybetűből áll. A konstansok nagybetűvel, a többi <
A <
Konstans megadása például:
<source lang="eiffel">Solar_system_planet_count: INTEGER = 9</soure>
===Vezérlési szerkezetek===
A feltételes utasítás így néz ki:
63 ⟶ 66 sor:
</source>
ahol akárhány <
Többszörös elágazás írható ezzel is:
93 ⟶ 96 sor:
</source>
ahol is az <
===Rutinok===
A rutinok a <
A paraméter nélküli rutinok zárójel nélkül hívhatók. Ez lehetővé teszi, hogy egy absztrakt osztály egyik konkrét utóda kiszámítsa azt, ami egy másik leszármazottban
A <
Az elavult rutinok a <
A felülírás letiltható a <source lang="eiffel">frozen</source> deklarációval.
===Ágensek===
A rutinok ágensbe burkolva átadhatók paraméterként. Ezek az ágensek azonban nem azonosak a robotok programozásában használt [[ágens]]ekkel.
Legyen az r rutin
<source lang="eiffel">
122 ⟶ 126 sor:
</source>
Az <
<
azt jelenti, hogy az első paraméter az a, a második paraméter nyitott. Hasonlóan,
<
jelentése az, hogy az első paraméter nyitott, a második paraméter a b. De lehet ilyen is:
<
itt minden paraméter meg van adva, de a behelyettesítés még nem történt meg, hanem arra vár, hogy meghívják az ágenst.
138 ⟶ 142 sor:
Lehet akár ilyen is:
<
ami ugyanazt jelenti, mint
<
===Osztályok===
Osztályok a <
Az osztályokban kiemelt szerep jut a létrehozó feature-öknek. Ezek a konstruktoroknak felelnek meg. A létrehozó feature-öket az osztály elején a <
<source lang="eiffel">
162 ⟶ 166 sor:
</source>
A létrehozó rutinok szokásos neve <
Osztályon belül nincs túlterhelés, de különböző osztályokban szabad egy műveletet ugyanazon a néven deklarálni.
Absztrakt osztályok és rutinok a <
Az osztályok alapesetben referenciák révén példányosulnak. Ha ezt nem akarjuk, akkor az osztályt <
<source lang="eiffel">
185 ⟶ 189 sor:
Az üres referencia a Void, ami a NONE fiktív osztály egyetlen példánya. Ha egy osztály <code>attached</code>, akkor az ilyen osztályú objektumok nem lehetnek Voidok. Az <code>expanded</code> osztályok implicit <code>attached</code> tulajdonságúak is, mivel nem referenciák. Az <code>attached</code> ellentéte a <code>detachable</code>. Újabban az <code>attached</code> az alapértelmezett, de a régebbi verziókban a <code>detached</code> volt az alapértelmezés. Kompatibilis módban megint a régebbi verzió az érvényes. Erre külön figyelni kell. Az <code>attached</code> típusú tagok nem vehetnek fel <code>detached</code> típusú értéket. Ez alól kivétel, ha egy elágazásban ellenőrizzük, hogy nem Void-e.
Az alacsony szintű
Az osztályokban <
===Öröklődés===
227 ⟶ 231 sor:
A szerződések alakja abban az osztályban, ahol az öröklésben először definiálják az illető feature-t:
<source lang="eiffel">
feature nev
require
--az elofeltetelt leiro allitasok
do
begin
--a rutin utasitasai
ensure
--az utofeltetelt leiro allitasok
end
invariant
--az invarianst leiro allitasok
</
Az öröklődés folyamán az előfeltételek enyhülhetnek, az utófeltételek szigorodhatnak. Ha nem írunk elő- vagy utófeltételt, akkor azok azonosan igazak lesznek. Ha egy rutinnak nincs előfeltétele, akkor a továbbiakban sem lehet, viszont az utófeltételben már lehetnek vállalásai. Az előfeltételhet vaggyal, az utófeltételhez éssel lehet továbbiakat hozzávenni:
<source lang="eiffel">
feature nev
require else
--az elofeltetelt leiro allitasok
do
begin
--a rutin utasitasai
ensure then
--az utofeltetelt leiro allitasok
end
</source>
Többszörös öröklődés esetén is az előfeltételek összevagyolódnak, az utófeltételek és az invariánsok összeéselődnek.
284 ⟶ 263 sor:
Az Eiffel lehetővé teszi, hogy egy rutint, aminek nem volt paramétere, újraimplementáljunk attributumként. Ekkor az előfeltételek elfelejtődnek, az utófeltételek és az invariánsok az osztály invariánsai lesznek.
Az <
===Kivételkezelés===
Az Eiffel nyelv a normál tevékenységtől való eltérést első vonalban a szerződésekkel fogja meg. A kivételek megmaradnak kivételes eseménynek. Akkor kerül rájuk sor, ha az adott rutin nem tudja biztosítani az utófeltételét. Ekkor az az elvárás, hogy legalább az osztályinvariánst állítsa helyre. A kivételkezelésre a rutin törzsén kívül, az <
Egy Eiffel rutin vázlata a <
<source lang="eiffel">
feature nev
do
begin
--a rutin utasitasai
rescue
--a kivételek kezelése
retry
end
</source>
Kivételek az EXCEPTIONS osztályból származtathatók.
===Generikusok===
Az általánosítás és az absztrakció az Eiffel nyelv alapelvei közé tartozik. A módszertan kiemelten kezeli az általános, de specializálható szerkezeteket. Bertrand minden projekthez javasol egy általánosítási szakaszt, ahol a projektben megalkotott osztályokat lehetőség szerint általánosítják. Generikusok valósítják meg például az adatszerkezeteket.
318 ⟶ 288 sor:
Egy generikus osztály vázlata:
<source lang="eiffel">
class SHD[G]
feature
--definiciok
end
</source>
Egy általános generikusban csak olyan műveletekre szabad hivatkozni, amelyek általánosságban minden osztályra meghívhatók, különben a generikus hibás lesz, és nem fog lefordulni. Megkötésekkel ez a hiba javítható:
<source lang="eiffel">
class SORTABLE_ARRAY[G->COMPARABLE]
feature
--definiciok; hasznalhatja az osszehasonlitast, a COMPARABLE muveleteit
end
</source>
Keverhető a nem korlátozottal:
<source lang="eiffel">
class HASH_TABLE[G, H-> HASHABLE]
feature
--definiciok
end
</source>
===Tömbök===
Tömbök megadhatók az ARRAY generikus osztály példányaiként, vagy például így:
<source lang="eiffel">
tomb = <<4, 6, 9>>
</
Ez egy manifeszt tömb, típusa <source lang="eiffel">ARRAY[INTEGER]</source>, tehát ekkor is a generikus <source lang="eiffel">ARRAY</source> osztály áll a háttérben.
Manifeszt konstansok stringekhez is elérhetők:
<source lang="eiffel">
INTEGER = "Go get a life!"
</source>
Használható az <
<
a, b, c, n = unique
</
A fordító ad nekik értéket. Ez pótolja a felsorolási típust.
===Tuple és rutin típusok===
A TUPLE az Eiffel direkt szorzat típusa. Hasonlít a generikusokra, de nem az, hiszen akárhány paramétere lehet:
<source lang="eiffel">
TUPLE[] = TUPLE :> TUPLE[STRING]
TUPLE[STRING] :> TUPLE[STRING, INTEGER]
TUPLE[STRING, INTEGER] :> TUPLE[STRING, INTEGER, STRING]
--...
</
ahol is a hosszabb TUPLE a kezdőszeletét tartalmazó <source lang="eiffel">TUPLE</source> altípusa <source lang="eiffel">(:>)
</source>. Emellett még teljesül az is, hogy a bővebb típust tartalmazó TUPLE tartalmazó típus <source lang="eiffel">(<:) </source>:
<source lang="eiffel">
TUPLE[] = TUPLE
TUPLE[STRING] <: TUPLE[ANY]
TUPLE[STRING, INTEGER] <: TUPLE[ANY, ANY]
TUPLE[STRING, INTEGER, STRING] <: TUPLE[ANY, ANY, ANY]
--...
</
A rutin típusok leszármazása:
A rutinok típusa a <source lang="eiffel">ROUTINE
</source>; ebből származik a <source lang="eiffel">PROCEDURE</source> és a <source lang="eiffel">FUNCTION</source> típus. A logikai függvények típusa a PREDICATE a FUNCTION altípusa. A TUPLE-hoz hasonlóan további altípusok képezhetők: <source lang="eiffel">
ROUTINE[TUPLE[]] = ROUTINE[TUPLE] = ROUTINE :> ROUTINE[TUPLE[STRING]]
ROUTINE[TUPLE[STRING]] :> ROUTINE[TUPLE[STRING, INTEGER]]
ROUTINE[TUPLE[STRING, INTEGER]] :> ROUTINE[TUPLE[STRING, INTEGER, STRING]]
--...
</
valamint
<source lang="eiffel">
ROUTINE[TUPLE[]] = ROUTINE[TUPLE] = ROUTINE
ROUTINE[TUPLE[STRING]] <: ROUTINE[TUPLE[ANY]]
ROUTINE[TUPLE[STRING, INTEGER]] <: ROUTINE[TUPLE[ANY, ANY]]
ROUTINE[TUPLE[STRING, INTEGER]] <: ROUTINE[TUPLE[ANY, ANY, ANY]]
--...
</
ahol a TUPLE-k a paramétereket tartalmazzák. A függvények általános típusa hasonló, csak kibővül a visszatérési értékkel:
<
ahol T a visszatérési érték típusa. Az altípusok a ROUTINE altípusaihoz hasonlóan képződnek, a visszatérési érték figyelembe vételével.
451 ⟶ 388 sor:
===Példaprogram===
<source lang="eiffel">
class
create
do
</source>
==Jegyzetek ==
|