A Delphi programozási nyelv

Absztrakt adattípusok

Az absztrakt adattípusok megvalósítására a Delphiben osztályok segítségével van lehetőség.
Ezeket külön unitokba tehetjük és így elválaszthatjuk őket külön fordítási egységekbe.

Szintaxis

Operátor-túlterhelés

Delphiben az operátor-túlterhelés csak rekordok esetén lehetséges, és ott se a szokásos módon. Az operátor alprogramokat a class operator kulcsszavakkal deklaráljuk, valamint nem használhatjuk a műveleti jeleket függvénynévként, így ehelyett az adott operátorhoz tartozó speciálisnevet kell megadni. Az operátor függvények címe nem kérdezhető le és nem hívhatók meg közvetlenül.

A felüldefiniálható operátorok az alábbiak: (Az A típus jelenti azt a típust, amelyre az operátort definiáljuk, a B tetszőleges típus.)

Szignatúra A felüldefiniált művelet
Implicit(a : A) : B; Implicit konverzió A-ról B-re
Explicit(a : A) : B; Explicit konverzió A-ról B-re
Negative(a: A) : B; - (unáris)
Positive(a: A) : B; + (unáris)
Inc(a: A) : B; Inc
Dec(a: A) : B; Dec
LogicalNot(a: A) : B; not
BitwiseNot(a: A) : B; not
Trunc(a: A) : B; Trunc
Round(a: A) : B; Round
Equal(a: A; b: A) : Boolean; =
NotEqual(a: A; b: A) : Boolean; <>
GreaterThan(a: A; b: A) : Boolean; >
GreaterThanOrEqual(a: A; b: A) : Boolean; >=
LessThan(a: A; b: A) : Boolean; <
LessThanOrEqual(a: A; b: A) : Boolean; <=
Add(a: A; b: A): B; +
Subtract(a: A; b: A): B; -
Multiply(a: A; b: A): B; *
Divide(a: A; b: A): B; /
IntDivide(a: A; b: A): B; div
Modulus(a: A; b: A): B; mod
LeftShift(a: A; b: A): B; shl
RightShift(a: A; b: A): B; shr
LogicalAnd(a: A; b: A): B; and
LogicalOr(a: A; b: A): B; or
LogicalXor(a: A; b: A): B; xor
BitwiseAnd(a: A; b: A): B; and
BitwiseOr(a: A; b: A): B; or
BitwiseXor(a: A; b: A): B; xor

Példa:

type TMyRecord = record class operator Add(a, b: TMyRecord): TMyRecord; // Két TMyRecord összeadása class operator Subtract(a, b: TMyRecord): TMyRecord; // Két TMyRecord kivonása class operator Implicit(a: Integer): TMyRecord; // Implicit konverzió Integerről TMyRecordra class operator Implicit(a: TMyRecord): Integer; // Implicit konverzió TMyRecordról Integerre class operator Explicit(a: Double): TMyRecord; // Explicit konverzió Double-ről TMyRecordra end; // Az összeadás definíciója class operator TMyRecord.Add(a, b: TMyRecord): TMyRecord; begin // ... end; var x, y: TMyRecord; begin x := 12; // Implicit konverzió Integerről y := x + x; // TMyRecord.Add(a, b: TMyRecord): TMyRecord b := b + 100; // TMyRecord.Add(b, TMyRecord.Implicit(100)) end;

Láthatósági szabályok

Részletek: Unitok kinézete és Az adatrejtés elve