Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ОписаниС языка PascalABC.NETΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 26

Автор W Cat

Если Π² Π±Π»ΠΎΠΊΠ΅ try ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вторая Ρ„ΠΎΡ€ΠΌΠ° Π±Π»ΠΎΠΊΠ° except с нСсколькими ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

var a,b: integer;

assign(f,'a.txt');

try

readln(a,b);

reset(f);

c:=a div b;

except

on System.DivideByZeroException do

writeln('ЦСлочислСнноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0');

on System.IO.IOException do

writeln('Π€Π°ΠΉΠ» отсутствуСт');

end;

Часто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ²ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ освобоТдСниС рСсурсов нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π’ этом случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ try ... except ΠΈ try ... finally.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3. Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ try ... except ΠΈ try ... finally.

assign(f,'a.txt');

try

reset(f);

try

try

c:=a div b;

except

on System.DivideByZeroException do

writeln('ЦСлочислСнноС Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0');

end;

finally

close(f);

end;

except

on System.IO.IOException do

writeln('Π€Π°ΠΉΠ» отсутствуСт');

end;

ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, связанноС c цСлочислСнным Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π° 0, обрабатываСтся Π² самом Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ Π±Π»ΠΎΠΊΠ΅ try, Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, связанноС с ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ - Π² самом внСшнСм. ΠŸΡ€ΠΈ этом, Ссли Ρ„Π°ΠΉΠ» Π±Ρ‹Π» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚, Ρ‚ΠΎ нСзависимо ΠΎΡ‚ возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ дСлСния Π½Π° 0 ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹: ΠΎΠ±Π·ΠΎΡ€

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ - это Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащий Π½Π°Π±ΠΎΡ€ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ свойств, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ классом. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ type ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π˜ΠΌΡΠ˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ° = interface

объявлСния ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈ свойств

end;

Для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° приводится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, для свойства послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ доступа read ΠΈ write.

НапримСр:

type

IShape = interface

procedure Draw;

property X: integer read;

property Y: integer read;

end;

ICloneable = interface

function Clone: Object;

end;

Поля ΠΈ статичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² интСрфСйс.

Класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс, Ссли ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства интСрфСйса Π² public-сСкции. Если класс Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ свойство интСрфСйса, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка компиляции. Класс ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ нСсколько интСрфСйсов. Бписок Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Ρ… интСрфСйсов указываСтся Π² скобках послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова class (Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ имя ΠΏΡ€Π΅Π΄ΠΊΠ°, Ρ‚ΠΎ послС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€Π΅Π΄ΠΊΠ°).

НапримСр:

type

Point = class(IShape,ICloneable)

private

xx,yy: integer;

public

constructor Create(x,y: integer);

begin

xx := x; yy := y;

end;

procedure Draw; begin end;

property X: integer read xx;

property Y: integer read yy;

function Clone: Object;

begin

Result := new Point(xx,yy);

end;

procedure Print;

begin

write(xx,' ',yy);

end;

end;

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°:

type

IPosition = interface

property X: integer read;

property Y: integer read;

end;

IDrawable = interface

procedure Draw;

end;

IShape = interface(IPosition,IDrawable)

end;

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΏΠΎ-сущСству прСдставляСт собой абстрактный класс Π±Π΅Π· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ входящих Π² Π½Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Для интСрфСйсов, Π² частности, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ всС ΠΏΡ€Π°Π²ΠΈΠ»Π° привСдСния Ρ‚ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ интСрфСйс, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСявно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊ Ρ‚ΠΈΠΏΡƒ интСрфСйса, Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ производится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ явно ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ нСвозмоТности прСобразования:

var ip: IShape := new Point(20,30);

ip.Draw;

Point(ip).Print;

ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ интСрфСйс, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π±Π΅Π· использования ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов virtual ΠΈΠ»ΠΈ override. Π’ частности, ip.Draw Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Draw класса Point. Однако, Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² обрываСтся. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… интСрфСйс, Π² подклассах, слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово virtual:

type

Point = class(IShape,ICloneable)

...

function Clone: Object; virtual;

begin

Result := new Point(xx,yy);

end;

end;

Для интСрфСйсов, ΠΊΠ°ΠΊ ΠΈ для классов, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ is ΠΈ as:

if ip is Point then

...

var p: Point := ip as Point;

if p<>nil then

writeln('ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ');

РСализация Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… интСрфСйсов

НСсколько интСрфСйсов ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ свойства. ΠŸΡ€ΠΈ наслСдовании ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… интСрфСйсов Ρ‚Π°ΠΊΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ свойства ΡΠ»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ΄ΠΈΠ½:

type

IShape = interface

procedure Draw;

property X: integer read;

property Y: integer read;

end;

IBrush = interface

procedure Draw;

property Size: integer read;

end;

Brush = class(IShape,IBrush)

// ΠΌΠ΅Ρ‚ΠΎΠ΄ Draw рСализуСтся Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹

end;

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π² интСрфСйсах, Π² .NET классы ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ интСрфСйсов Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° интСрфСйса для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ класса Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС явного привСдСния ΠΊ Ρ‚ΠΈΠΏΡƒ интСрфСйса. Π’ PascalABC.NET Ρ‚Π°ΠΊΠΈΠ΅ классы ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ нСльзя, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌΠΈ классами, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π² .NET, ΠΌΠΎΠΆΠ½ΠΎ. НапримСр, Ρ‚ΠΈΠΏ integer явно Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс IComparable:

var i: integer := 1;

var res : integer := IComparable(i).CompareTo(2);

// i.CompareTo(2) - ошибка компиляции

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹: ΠΎΠ±Π·ΠΎΡ€

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ (generic) называСтся шаблон для создания класса, записи ΠΈΠ»ΠΈ интСрфСйса, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Класс (запись, интСрфСйс) образуСтся ΠΈΠ· шаблона класса (записи, интСрфСйса) подстановкой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ послС ΠΈΠΌΠ΅Π½ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках. НапримСр, Stack<T> - шаблон класса списка элСмСнтов Ρ‚ΠΈΠΏΠ° T, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏΠΎΠΌ T, Π° Stack<integer> - класс списка с элСмСнтами Ρ‚ΠΈΠΏΠ° integer.

ΠžΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ здСсь.

Для объявлСния шаблона класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

type

Node<T> = class

data: T;

next: Node<T>;

public

constructor Create(d: T; nxt: Node<T>);

begin

data := d;

next := nxt;

end;

end;

Stack<T> = class

tp: Node<T>;

public

procedure Push(x: T);

begin

tp := new Node<T>(x,tp);

end;

function Pop: T;

begin

Result := tp.data;

tp := tp.next;

end;

function Top: T;

begin

Result := tp.data;

end;

function IsEmpty: boolean;

begin

Result := tp = nil;

end;

end;

ИспользованиС шаблона класса ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π½ΠΈΠΆΠ΅:

var

si: Stack<integer>;

sr: Stack<real>;

begin

si := new Stack<integer>;

sr := new Stack<real>;

for var i := 1 to 10 do

si.Push(Random(100));

while not si.IsEmpty do

sr.Push(si.Pop);

while not sr.IsEmpty do

write(sr.Pop,' ');

end.

ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ называСтся инстанцированиСм.

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹: ΠΎΠ±Π·ΠΎΡ€

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ (generic) называСтся ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, парамСтризованная ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° образуСтся ΠΈΠ· ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ подстановкой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ послС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… скобках.

НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ обобщённая функция ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ:

function FindFirstInArray<T>(a: array of T; val: T): integer;

begin

Result := -1;

for var i:=0 to a.Length-1 do

if a[i]=val then

begin

Result := i;

exit;

end;

end;

var x: array of string;

begin

SetLength(x,4);

x[0] := 'Ваня';

x[1] := 'Коля';

x[2] := 'Π‘Π΅Ρ€Π΅ΠΆΠ°';

x[3] := 'Баша';

writeln(FindFirstInArray(x,'Π‘Π΅Ρ€Π΅ΠΆΠ°'));