Begin . . . .

Begin

End.

Begin

Begin

Begin

Begin

End.

Begin

Begin

Begin

Begin

data:=x; {записываем значение пар-раx в поле data}

end;

Function TInt.Outdata; // описание метода чтения Outdata

result:=data; {метод возвращает значение поляdata}

end;

Procedure TInt.Add; {метод сложения поляdata с пар-ромx }

data:=data+x; {к полюdata прибав.x, результат–в полеdata}

end;

Var a:TInt; {объявляемa как объект классаTInt}

x:integer;

{ TODO …………………………………………………}

a:=TInt.Create; {создаем объектa с помощьюконструктора}

a.Impdata(5); {с помощьюметодаImpdata полю data присвоим 5}

writeln('data=', a.Outdata); {методOutdata читает полученное значение поляdata объектаa и выводит его на экран}

write('x=');

readln(x); {вводимx с клавиатуры}

a.Add(x);{объект a вызывает методAdd с парам.x, т.е. к полюdata прибавляется x)}

writeln('data=', a.Outdata); {методOutdata читает значение поляdata объектаa }

a.Free; {уничтожаем объектa с помощью деструктора}

readln;

Программа со свойством

program Integer_class2;

{$APPTYPE CONSOLE}

uses SysUtils;

 

Type TInt=class

data:integer;

Procedure impdata (x:integer);

Function Outdata:integer;

Procedure Add(x:integer);

Property dataInt:integer //свойство

read Outdata //чтение из поля

write Impdata; //запись в поле

end;

Procedure TInt.impdata;

data:=x;

end;

Function TInt.Outdata;

result:=data;

end;

Procedure TInt.Add;

data:=data+x;

end;

Var a:TInt;

x:integer;

{ TODO……………………………… }

a:=TInt.Create; {создаем объектa с помощьюконструктора}

(1) a.dataInt:=5;{св-воdataInt, вызванное объектомa, с помощью
метода
impdata заносит 5 в полеdata}

writeln('data=', a.dataInt); { св-воdataInt, вызванное объектом
a, с помощью метода Outdata выводит значение поляdata}

write('x=');

readln(x);

a.Add(x);

writeln('data=', a.dataInt);

a.Free;

readln;

 

Таким образом, использование методов чтения и записи, а также свойств обеспечивает сохранение содержимого полей, прямой доступ к полям не желателен, хотя и не запрещен.

Например, если в операторе присваивания вместо имени свойства a.dataint:=5; указать имя поля a.data:=5; то на первый взгляд делается то же самое. Однако разница заключается в том, что при обращении к свойству dataint автоматически подключается метод impdata, в котором реализуется запись в поле, а также могут быть другие действия.

Есть другие варианты определения свойств:

1.В методах, входящих в состав свойств, может осуществляться проверка устанавливаемой величины на попадание в допустимый диапазон значений и вызов других процедур. Если же потребности в специальных методах чтения и записи нет, можно вместо имен методов применить имена полей. Рассмотрим следующую конструкцию:

Type TInt = class

data: integer;

Procedure DoSomething;

Procedure Imput (x: integer);

Property DataInt: integer read data {чтение поля}

write Imput;

end;

Procedure TInt.Imput (x:integer); //метод записи в поле

if x <> data then data:=x;

DoSomething;

end;

В этом примере чтение значения свойства DataInt означает просто чтение поля data. Зато при присваивании значения полю внутри Imput вызывается метод DoSomething.

2.Если необходимо чтобы поле было доступным или только для чтения, или только для записи, следует опустить (не писать) соответственно части read или write.

3.Для присвоения свойству значения по умолчанию используется ключевое слово default. Например, для свойств со значением Boolean можно записать:

Property Visible: Boolean read GetV

write SetV default True;

 

4.Свойство может быть векторным, тогда внешне оно выглядит как массив:

Property Elem [j:integer]: realread OutElem //квадратные скобки!

write ImpElem;

 

Для векторного свойства необходимо описать не только тип элементов массива, но также имя и тип индекса. После ключевых слов read, write должны стоять имена методов. Использование здесь полей массивов недопустимо. Метод, читающий значения векторного свойства, должен быть описан как функция, возвращающая значение того же типа, что и элементы свойства и имеющая единственный параметр того же типа и с тем же именем, что и индекс свойства:

Function OutElem (j:integer): Real;

Метод, помещающий значения в такое свойство, описывается как процедура и первым параметром имеет индекс, а вторым – переменную нужного типа (которая может быть как параметром–значением, так и параметром – переменной):

Procedure ImpElem (j:integer; r:real);

5.Заметим, что у векторных свойств есть важная особенность: некоторые классы в Delphi «построены» вокруг основноговекторного свойства. Основной метод такого класса дает доступ к некоторому массиву, а все остальные методы являются как бы вспомогательными. Специально для облегчения работы в этом случае оно может быть описано с ключевым словом default.

Отметим, что слово default для обычных и векторных свойств применяется с разным синтаксисом:

Type TVect = class

…………………………………………

Property Elem[j:integer]:Realread OutElem

write ImpElem; default;

end;

Если у объекта есть такое свойство, то можно в программе его не упоминать, а ставить индекс в квадратные скобки сразу после имени объекта.

Var x: TVect;

x.Elem[1]:=0.1; {первый способ}

x[2]:=0.2; {второй способ}

. . . .

End.

 

 


Наследование и перекрытие методов.

 

Унаследованные от класса – предка поля и методы доступны в классе – потомке. Если имеет место совпадение имен методов, то, говорят, что они перекрываются. По тому, какие действия происходят при вызове, методы делятся на три группы:

1. Статические методы.

2. Виртуальные и динамические методы (Virtual and Dynamic).

3. Перегружаемые методы (Overload).