Навигация
Главная
Поиск
Форум
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
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63877
Модуль Forms 63618
ТЕХНОЛОГИИ ДОСТ... 60461
Пример работы с... 59796
Имитационное мо... 55924
Реклама
Сейчас на сайте
Гостей: 18
На сайте нет зарегистрированных пользователей

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

Моделирование литейного цеха на GPSS + Пояснительная записка
Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...
Моделирование процесса обработки заданий на вычислительном центре на GP...

Реклама



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

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
ICQ
PHP глазами хакера
Технология .Net в VB
Turbo Pascal for ...
ShadelLabel
Голосование для ...
Распознавание иде...
API (Применение A...
Панель поиска
Программирование ...
VFW
MPTools
PHP: Полезные приемы
Основы программир...
PrevInst
Мод "проверочный ...
PHP, MySQL и Drea...
Blobs [Исходник н...
Pirc
Отключение и вклю...

Топ загрузок
Приложение Клие... 100447
Delphi 7 Enterp... 85790
Converter AMR<-... 20067
GPSS World Stud... 12518
Borland C++Buil... 11572
Borland Delphi ... 8504
Turbo Pascal fo... 7023
Visual Studio 2... 4989
Калькулятор [Ис... 4739
FreeSMS v1.3.1 3535
Случайные статьи
Обработка ошибок в...
Блок BUFFER
Связывание фреймов
Операторы класса n...
Что демонстрирует ...
Label
Разновидности комп...
Спам-фильтр
Терминальные устро...
Драйвер является е...
More Book Stuff
Глава 26. ХР в ...
Основы поисковой о...
13.4. Структуры дл...
Для просмотра всег...
Глобальные Multica...
Invalid floating-p...
Основы WinApi
Как обогнать конку...
Функция TextWidth ...
Дополнение n-й бит...
Integer expression...
Быстрая индексация...
Экспертная система...
Группа блоков синх...
Статистика



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


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