Implementation

End.

Begin

Else

End

Else

Then

If RadioButton1.Checked

Begin

Then

Begin

Begin

Begin

Begin

Begin

Begin

Begin

Var

Public

Private

Type

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Uses

Dialogs, StdCtrls;

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Edit1: TEdit;

Edit2: TEdit;

GroupBox1: TGroupBox;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

{ Private declarations }

{ Public declarations }

end;

type Tperson=class

fname:string;

constructor Create(name:string);

function info:string; virtual;

end;

Tstud=class(Tperson) { класс– потомок }

fgr:integer; { поле для номера группы }

constructor Create(name:string;gr:integer);

function info:string; override;

end;

Tprof=class(Tperson) { класс– потомок }

fdep:string;; { поле для названия кафедры }

constructor Create(name:string; dep:string);

function info:string; override;

end;

Сonst szl=10;

Form1: TForm1;

list:array[1..szl] of Tperson;

n:integer;

implementation { исполняемая часть }

{$R *.DFM}

constructor Tperson.Сreate(name:string); { описание конструктора }

fname:=name;

end;

constructor Tstud.Create(name:string;gr:integer);

inherited create(name);

fgr:=gr;

end;


constructor Tprof.Create(name:string;dep:string);

inherited create(name);

fdep:=dep;

end;

function Tperson.info:string;

result:=fname;

end;

function Tstud.info:string;

result:=fname+' gruppa '+inttostr(fgr);

end;

function Tprof.info:string;

result:=fname+' department '+fdep;

end;

procedure TForm1.Button1Click(Sender: TObject);

// процедура обработки нажатия на кнопку «Добавить»

if n<szl

list[n]:=Tstud.Create(Edit1.text, StrtoInt(Edit2.text))

list[n]:=Tprof.Create(Edit1.text, Edit2.text);

n:=n+1;

ShowMessage('Spisok zapolnen');

end;


procedure TForm1.Button2Click(Sender: TObject);

// процедура обработки нажатия на кнопку «Список»

Var i:integer;

St:string;

for i:=1 to szl do

if list[i]<>nil then

St:=St+list[i].info+#13;

// list[i].info вызовет тот метод info, которому соответствует элемент

ShowMessage('Spisok:'+#13+St);

end;

Процедура TForm1.Button1Click, которая запускается нажатием кнопки «Добавить» создает объект list[n] класса либо Tstud, либо Tprof.

Класс создаваемого объекта определяется состоянием переключателя RadioButton. Установка переключателя в положение Студент определяет класс Tstud, а в положение – Преподаватель определяет класс Tprof. Процедура TForm1.Button2Click, которая запускается нажатием кнопки Список (Button2) применяет метод info к каждому элементу массива list[i] как к объекту списка и формирует строку, представляющую весь итоговый список.

Виртуальность метода info обеспечивает применение к объекту именно того метода info, который соответствует типу объекта.

Отметим, что в данной программе результаты выводятся в окно сообщения процедурой ShowMessage. Например:

Showmessage('Spisok:'+#13+st);

Showmessage('spisok zapolnen');


Области видимости.

При описании нового класса пользователь стоит перед компромиссом. С одной стороны необходимо скрыть методы и поля, представляющие собой внутреннеe устройства класса, поскольку маловажные детали будут бесполезны и только помешают целостности восприятия пользователем, использующем данный класс. С другой стороны, если слишком ограничить того, кто будет порождать классы-потомки и не обеспечить ему достаточный набор инструментальных средств, то он не сможет использовать ваш класс.

Существует механизм доступа к составным частям объекта, определяющий области, где ими можно пользоваться – области видимости. Поля, методы и свойства могут относиться к четырем группам и в описании класса могут быть размещены в одной из секций.

Пример:

Type <имя класса>= class

private...

protected...

public...

published...

end;

Т.о. поля, методы и свойства могут быть:

1. private – личные

2. protected – защищенные

3. public – общие

4. published – опубликованные

1) Все, что объявлено в секции private доступно только в том модуле, где дано описание класса, т.е. поля, методы и свойства находящиеся в секции private доступны только в методах класса и в функциях, которые содержатся в модуле описанного класса. Это позволяет полностью скрыть детали внутренней реализации класса. Свойства и методы этой секции можно изменить, но это не сказывается на программах работающих с объектами данного класса.

2) Поля, методы и свойства секции protected также доступны внутри модуля с описанным классом, но кроме этого (и это главное) они доступны в классахпотомках данного класса, в том числе и в других модулях. Это особенно необходимо для разработчиков классов – потомков.

3) Поля, методы и свойства секции public доступны любому модулю, они доступны из других функций, методов объектов, как в данном модуле, так и в других модулях, ссылающихся на него.

4) Секция published имеет особое значение для интерфейса визуального программирования в Delphi. Все, что помещено в секцию published, доступно инспектору объекта во время разработки проекта, т.е. здесь собраны те свойства объекта, которые будут видны не только во время исполнения приложения, но и из среды разработки.

Рассмотрим пример, который иллюстрирует три области видимости:

Пример. Рассмотрим два модуля (Unit First и Unit Second)

Unit First;

interface

type TFirstObj= class

private // личные

procedure metod1;

protected // защищенные

procedure metod2;

public // общие

procedure metod3;

// методы 1,2,3 – методы класса

end;

procedure TestProc1;

Uses Dialogs;

var AFirstObj:TFirstObj; //описанный объект AFirstObj класса

// TFirstObj


procedure TestProc1;

begin AFirstObj:=TFirstObj.Create;

AFirstObj.Metod1;

AFirstObj.Metod2;

AFirstObj.Metod3; //внутри модуля класса допустимы все

// три обращения

AFirstObj.Free;

end;

procedure TFirstObj.Metod1;

begin show Message (‘1’); //вывод информации в окно сообщения

end;

procedure TFirstObj.Metod2;

begin show Message (‘2’);

Metod1;

end;

procedure TFirstObj.Metod3;

begin show Message (‘3’);

end;

End. // конец модуля First

-----------------------------------------------------------------

Unit Second; // начало модуля Second

interface

Uses First; // использует модуль First

type TSecondObj= class (TFirstObj)

procedure Metod4;

end;

procedure TestProc2; // процедура модуля Second


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: