Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
ТЕХНОЛОГИИ ДОСТ... 63038
Имитационное мо... 58350
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

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

Обратное размещение элементов ЭВС на Delphi + Пояснительная записка
База данных электронного документооборота на Delphi + бд Intebase
База данных - словарь терминов на Delphi + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Виртуальные методы ( 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 03 2014 02:06:20 · 0 Комментариев · 5148 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Шейдеры в Delphi
Rotolabel
База Allsubmitter...
AVIwriter
Tank [Исходник на...
Geo-Whois
БД сеть компьютер...
CLR via C#
OnlineIP
Tag Игра "Пятнашк...
Averaging [Исходн...
PHP 5 в подлинник...
Краснов М. - Open...
База каталогов ( ...
3D Октаэдр
Усложнённый кальк...
TelBook
Cooltray
PDF
BIOS

Топ загрузок
Приложение Клие... 100480
Delphi 7 Enterp... 87871
Converter AMR<-... 20082
GPSS World Stud... 13515
Borland C++Buil... 12060
Borland Delphi ... 8671
Turbo Pascal fo... 7048
Visual Studio 2... 5005
Калькулятор [Ис... 4910
FreeSMS v1.3.1 3545
Случайные статьи
inf (тир systemroo...
Типы блокировок в ...
Лучшие средства от...
Нетиповые операции...
шифрования для фай...
";" expected
Где купить постель...
Блокировка сна
Интернет-ресурсы о...
Заключение
Анализ слов
Протокол XMODEM
ключу Для двух исп...
Сканирование фотог...
Базовые устройства
Новый шаблон прави...
Новинка планшетов ...
Обработка исключит...
иллюстрации проект...
Что документировать
Простота ведет к п...
Оптимизация QueryI...
Краткий обзор инте...
ПОСТРОЕНИЕ ЭКСПЕРТ...
Система Mach - исп...
Статистика



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


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