Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

База данных студентов на Turbo Pascal (Списки) + Пояснительная записка
Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Обратное размещение элементов ЭВС на Delphi + Пояснительная записка

Виртуальные методы ( 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 Комментариев · 8461 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Конвертирование и...
TDBF
SynEdit
Фильтры изображений
PHP 5 для "чайников"
Ehlib
Панель Наша Кнопка
OnlineIP
XPcontrol
Animation Effect ...
Мод "проверочный ...
C# 2005 и платфор...
Игра в крестики н...
Converter AMR<->W...
Анимированное поя...
Error mod
Разработка интерн...
RxLIB
Самоучитель Прогр...
RSS Feeds

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98018
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14239
Borland Delphi ... 10374
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Конфигурируя бранд...
Программный интерфейс
Управления рубрика...
Мышь-НЛО
Установка операци...
Использование цикл...
сообщения
Многоканальные уст...
Интервенция
Пример на создан»—...
Как я обращался в ...
Виртуальный букмек...
Исключительные сит...
Серверы, обеспечив...
Замечания. Изучени...
Новое оружие ICQ: ...
Функция GetMaxMode...
Генерация всех под...
Неупорядоченные сп...
Данная книга
Основные понятия с...
Системные тесты в ...
3d Принтер
Игровые автоматы д...
Этап 1 - исключени...
Статистика



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


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