Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OAP(теория).doc
Скачиваний:
49
Добавлен:
15.02.2016
Размер:
687.62 Кб
Скачать

Примеры

Класс геометрических фигур (эллипсмногоугольник) может иметь методы для геометрических трансформаций (смещениеповоротмасштабирование).

Класс потоков имеет методы для последовательной передачи данных. Потоком может быть информация, вводимая пользователем с терминала, обмен данными по компьютерной сети, файл (если требуется последовательная обработка данных, например, при разборе исходных текстов программ).

В объектно-ориентированных языках

В объектно-ориентированных языках класс является абстрактным типом данных.[Прим. 1] Полиморфизм реализуется с помощью наследования классов и виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный в классе-потомке. Это называется поздним связыванием. [Примером использования может служить обработка массива, содержащего экземпляры как класса-родителя, так и класса-потомка: очевидно, что такой массив может быть объявлен только как массив типа класса-родителя и у объектов массива могут вызываться только методы этого класса, но если в классе-потомке какие-то методы были переопределены, то в режиме исполнения для экземпляров этого класса будут вызваны именно они, а не методы класса-родителя.]

Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования — древовидные или сетевидные.

Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе). Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.

Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников, которые в свою очередь наследуются от одного класса (так называемая «Проблема ромба»): если метод общего предка был переопределён в посредниках, неизвестно, какую реализацию метода должен наследовать общий потомок. Решается эта проблема путём отказа от множественного наследования для классов и разрешением множественного наследования для полностью абстрактных классов (то есть интерфейсов) (C#Delphi,Java), либо через виртуальное наследование (C++).

9. Динамическое создание объектов на форме с помощью классов.

Статья посвящена динамическому созданию обычных и визуальных объектов, а также наследованию объктов

Задача формулируется следующим образом- дан целочисленный массив содержимого формы:0- combobox,1-spinedit,2-edit,3 и 4-panel,необходимо создать эти различные объекты на форме или на панелях, для удобства доступа к ним. Естественно предложить решение без динамического создания- размещаем объекты на форме, устанавливаем единый обработчик события ( так как формат обработчиков одинаков-один параметр Sender:TObject, то такое возможно), а в свойстве Tag объектов храним его id(не номер типа а номер объекта в массиве), для каждого значения tag исполняем то же код. Однако же если массив двумерный как в редакторе кампаний hi, то сложно использовать этот метод, а если формат размещен в файле, базе данных или присваивается при выполении программы то без динамических объектов не обойтись.

Пример использовался для написания редактора кампаний, когда разные свойства требовали разных объектов, например количество сценариев требовало наличие spinedit,для названия кампании нужен edit,а для имен файлов карт panel, и не простая, а чтобы при клике вызывался opendialog.

Как это делается:

Во первый объявляем саму структуру объектов - у нас будет двумерный массив объектов, двумерный массив подписей к нему, одномерный массив панелей для объектов и также хранится массив количества свойств(для двумерных массивов, например свойств кампании всего 2, а свойств сценариев уже 5).

tcampa_struct=class

num:array[0..2] of array of integer;

p:array[0..2]of TPanel;

l:array[0..2]of array of TLabel;

wc:array[0..2] of array of TWinControl;

constructor Create(Sender:TObject);

destructor Free;

end;

Теперь опишем как создавать объекты. Сначала обратим внимание на TwinControl -это наибольший предок всех,используемых мною, объектов. Для любого объекта в delphi необходимо сделать такое присвоение: object:=TObject.Create(); , то есть создать экземляр класса, далее для визуальных объектов необходимо присвоить родителя object.parent:=hisparent; после этого объект создастся со свойствами по умолчанию, а затем нужно присвоить часть свойств нужным вам значениям. Я изменяю размер и расположение объектов. В зависимости от типа объекта конструкторы разные и вызываются дочерние: wc[i,j]:=TComboBox.Create(p[i]);

constructor tcampa_struct.Create(Sender:TObject);

var i,j:integer;

begin

for i:=0 to 2 do

begin

setlength(num[i],campa_structC[i]);

setlength(l[i],campa_structC[i]);

setlength(wc[i],campa_structC[i]);

end;

num[0,0]:=2;num[0,1]:=1;

num[1,0]:=2;num[1,1]:=3;num[1,2]:=4;num[1,3]:=1;num[1,4]:=1;

num[2,0]:=0;num[2,1]:=0;num[2,2]:=1;num[2,3]:=0;num[2,4]:=1;

for i:=0 to 2 do

begin

p[i]:=TPanel.Create(TComponent(Sender));

p[i].Parent:=TWinControl(Sender);

p[i].Left:=500;

p[i].Width:=340;

p[i].Height:=30*campa_structC[i];

end;

p[0].Top:=60;

p[1].Top:=130;

p[2].Top:=300;

for i:=0 to 2 do

for j:=0 to campa_structC[i]-1 do

begin

l[i,j]:=TLabel.Create(p[i]);

l[i,j].Parent:=p[i];

l[i,j].Left:=2;

l[i,j].Top:=j*30+2;

l[i,j].Height:=28;

l[i,j].Width:=166;

end;

for i:=0 to 2 do

for j:=0 to campa_structC[i]-1 do

begin

case num[i,j] of

0:wc[i,j]:=TComboBox.Create(p[i]);

1:wc[i,j]:=TSpinEdit.Create(p[i]);

2:wc[i,j]:=TEdit.Create(p[i]);

3:wc[i,j]:=TPanel.Create(p[i]);

4:wc[i,j]:=TPanel.Create(p[i]);

end;

wc[i,j].Parent:=p[i];

wc[i,j].Left:=172;

wc[i,j].Top:=j*30;

wc[i,j].Height:=25;

wc[i,j].Width:=166;

end;

l[0,0].Caption:='Название';

l[0,1].Caption:='Количество сценариев';

l[1,0].Caption:='Имя сценария';

l[1,1].Caption:='Имя файла';

l[1,2].Caption:='Имя ИИ файла';

l[1,3].Caption:='Главный игрок';

l[1,4].Caption:='Количество бонусов';

l[2,0].Caption:='Номер';

l[2,1].Caption:='Уточненный номер';

l[2,2].Caption:='Значение';

l[2,3].Caption:='Тип адресата';

l[2,4].Caption:='Номер адресата';

end;

Все создано кроме небольших оговорок необходимо присвоить события и некоторые начальные значение, скажем номер игрока не должен выходить за пределы 1 до 8. События для объектов должны быть тоже объявлены в форме. Вот я вызываю при клике на панель раличные opendialog и пишу имя файла в название.

procedure TFormC1.him_click(Sender:TObject);

begin

if OpenDialogm.Execute then

TPanel(Sender).Caption:=OpenDialogm.FileName;

end;

procedure TFormC1.hiai_click(Sender:TObject);

begin

if OpenDialogAi.Execute then

TPanel(Sender).Caption:=OpenDialogAI.FileName;

end;

При закрытии формы не забываем вызвать деструктор.

destructor tcampa_struct.free();

var i,j:integer;

begin

for i:=0 to 2 do

for j:=0 to campa_structC[i]-1 do

begin

l[i,j].Free;

wc[i,j].Free;

end;

for i:=0 to 2 do

p[i].Free;

end;

Данная процедура в дополнении к конструктору. Обратим внимание на приведение к дочерним типам TcomboBox(Campa_struct.wc[2,3]).

procedure TFormC1.CS_init;

var i,j:integer;

begin

TPanel(Campa_struct.wc[1,1]).OnClick:=him_click;

TPanel(Campa_struct.wc[1,2]).OnClick:=hiai_click;

TSpinEdit(Campa_struct.wc[1,3]).Value:=1;

TSpinEdit(Campa_struct.wc[1,3]).MinValue:=1;

TSpinEdit(Campa_struct.wc[1,3]).MaxValue:=8;

ReadFiles;

TComboBox(Campa_struct.wc[2,3]).Clear;

for i:=0 to 8 do

TComboBox(Campa_struct.wc[2,3]).Items.Add(campa_actors[i]);

TComboBox(Campa_struct.wc[2,3]).OnChange:=Campa_change_actor;

TComboBox(Campa_struct.wc[2,0]).OnChange:=Campa_change_actor2;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]