Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 25
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
Диплом - база данных поставщиков на Delphi (MS Sql Server)+ Пояснительна...
Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...

Виртуальные методы ( V-методы)
1. Реализуют свойство полиморфизма объектов.
2. Если О-метод объявлен виртуальным, то все потомки должны описываться виртуальными ( т.е. статический метод никогда не может подавить виртуальный).
3. V-метод в заголовке содержит директиву Virtual, например:
Procedure P1 (……………..); Virtual;
4. Если V-метод переопределяется у потомков, то заголовок (имя, порядок, тип и количество параметров) не должны изменяться. Иначе у статических методов – у них можно изменять формальные параметры.
5. Каждый О-тип, имеющий V-методы, обязан иметь Constructor инициализирующий экземпляр объекта. Constructor – специальный тип процедуры, который выполняет начальные установки для работы механизма V-методов. Каждый отдельный экземпляр объекта должен быть инициализирован отдельным вызовом Constructor’a. При этом Constructor устанавливает связь экземпляра с таблицей виртуальных методов VMT. Constructor всегда вызывается до первого вызова V-метода. Сам Constructor статический, хотя может содержать вызовы V-методов.
6. Каждый О-тип, содержащий V-методы, имеет свою таблицу VMT. Структура VMT и ее взаимодействие с объектами и V-методами приведена на рис. 7.
Виртуальные методы ( V-методы)
Рис. 7. Таблица виртуальных методов VMT.

Таблица VMT служит для передачи управления тому методу, который соответствует вызову определенного объекта. По сути VMT является таблицей адресов для косвенного перехода. При этом каждый из методов не является какой-то независимой процедурой или функцией Паскаля – любой из методов может вызываться только из какого-либо объекта, причем при каждом таком вызове в метод всегда передается невидимый адрес (SELF) вызывающего объекта, поэтому метод будет работать с полями того объекта, который его вызвал. VMT создается одна для каждого О-типа (но не экземпляра). При передаче в процедуру или функцию полиморфного объекта, имеющего V-методы, передается и таблица VMT. Это гарантирует, что сработают именно те методы, которые подразумевались при вызове.
Рассмотрим работу программы рисования различных фигур после придания ей полиморфических свойств.

Program
OOP_Primer;


Uses 
CRT, Graph;



Type
TFigure

=
Object




                             x, y             :Integer;   {

координаты

фигуры
}




                             color           :Word;     { 

и
её

цвет
}




                             Constructor Init ( ax, ay :Integer;  col
:Word );




                             Procedure Draw ( col :Word ); Virtual;




                             Procedure Show; 




                             Procedure Hide;




                             Procedure MoveTo ( dx, dy :Integer );




                          End;



 




        TPoint  = Object ( TFigure )       { TFigure –

имя

родительского


типа

}




                            Procedure Draw ( col :Word ); Virtual;




                         End;



 




        TCircle = Object ( TPoint )




                           R                        :Integer;                 {

радиус


окружности

}




                           Constructor        Init    (ax,ay,aR  :Integer;  col
:Word );





                           Procedure           Draw ( col :Word );
Virtual;




                         End;



 




                          {


реализация



методов

TFigure

}




Constructor
 
TFigure. Init ( ax, ay :Integer;  col :Word );




Begin    x := ax;    y := ay;    color := col;       End;



 




Procedure TFigure. Draw( col :Word );



Begin
{ничего не делает, потомки должны перекрывать этот метод}

End;



 




Procedure TFigure. Show;




Begin     Draw ( Color );      End;



 




Procedure TFigure. Hide;




Begin     Draw ( GetBkColor );   End;



 




Procedure TFigure. MoveTo ( dx, dy :Integer ):




Begin   Hide;   x := x+dx;   y := y+dy;    Show;     End;



 




                     {


реализация


методов

TPoint

}




Procedure TPoint. Draw( col :Word );




Begin    PutPixel ( x, y, col );       End;


 




                     {


реализация


методов

TCircle

}




Constructor TCircle. Init;



Begin
Inherited Init ( ax, ay, col );  R := aR;     End;




Procedure TCircle. Draw( col :Word );




Begin   SetColor ( col );    Circle ( x, y, R );    End;


 



 { $I
GrInit }



 Var    
VCircle     : TCircle;


Begin


  GrInit;


  VCircle. Init ( 320, 240, 100, 12
);


  VCircle. Show;


  ReadKey;


  CloseGraph;


End.





В этом варианте программа нарисует на экране окружность. Действительно, при работе метода VCircle. Init Constructor создаст таблицу VMT для типа TСircle и экземпляр VCircle установит с ней связь. При вызове метода Show из объекта VCircle последует передача управления унаследованному методу TFigure. Show, причем следует иметь в ввиду два момента:
1. Связь с методом TFigure. Show из головной программы установлена статически (во время трансляции).
2. При вызове этого метода в качестве невидимого фактического параметра предается адрес объекта VCircle, который в свою очередь имеет связь с VMT типа TCircle.
Связь с виртуальным методом TCircle.Draw осуществляется путем косвенного перехода через таблицу VMT объектного типа TCircle, которая и рисует окружность. Аналогично будет работать механизм связи с виртуальными методами, если в описанную иерархию фигур добавлять новые фигуры со своими виртуальными методами Draw.
Все приведенные до сих пор экземпляры объектов были статического типа (не путать со статическими методами!), они описывались зарезервированным словом Var, им присваивались имена, и сами объекты размещались в сегменте данных или в стеке. Но точно так же, как и любые типы данных в Паскале, объекты можно размещать в динамической памяти и работать с ними, применяя указатели. Паскаль включает несколько усовершенствованных процедур для размещения и удаления объектов из памяти наиболее эффективными способами. Подробное их рассмотрение выходит за рамки данных методических указаний и предлагается изучить самостоятельно, например, по работе [1,2]. Отметим только, что Паскаль предоставляет специальный тип метода Destructor, называемый «сборщиком мусора» или деструктором, для очистки и удаления динамических методов. Деструктор объединяет этап удаления объекта с другими действиями, необходимыми для данного типа объекта. Деструктор размещается вместе с другими методами объекта в определении типа объекта. В приведенных ниже примерах используются только статические объекты, поэтому непосредственной необходимости в деструкторах нет. Тем не менее, они присутствуют в методах объектов для полноты картины и выполняют некоторые завершающие действия в программе.
Опубликовал Kest April 02 2014 22:06:20 · 0 Комментариев · 7914 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
C# Учебный курс
Доступа к БД Fire...
Панель поиска
Медиа комбайн
Atb
Программирование ...
Быстрое создание ...
Delphi 7: Для про...
PHP: настольная к...
FormShape [Исходн...
Рисование PopupMenu
Х. М. Дейтел, П. ...
AlnComponents
DemoEdit [Исходни...
THttpScan v4.1
Расширенный загру...
Создание оригинал...
Редактор текста (...
Delphi7 Для профе...
Tenis [Исходник н...

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Использование авто...
ЛОГИЧЕСКИЕ КЛЮЧИ В...
Иерархии ЦС менее ...
Специализация
Форма Access - про...
Сайты платящие за ...
Простейшие комбина...
Прекращение отладк...
Маниуляции с деревом
Функция date() - в...
Сортировка каталог...
Развлечения Starda...
Официальный игрово...
Сценарий: для моде...
1xBet интернет ста...
Как осуществляется...
На обрабатывающий ...
Выработка решенияК...
Листинг 5.5. Автом...
Вызов функции conn...
Рост в женском пре...
Структура книги
IBS Вы можете пред...
4.3. Принципы
Явная загрузка мод...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?