Навигация
Главная
Поиск
Форум
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
Создание отчето... 65090
Модуль Forms 64856
Пример работы с... 63297
ТЕХНОЛОГИИ ДОСТ... 61565
Имитационное мо... 57418
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Выбор наилучших альтернатив с использованием методов оптимизации на Delp...
Моделирование работы класса персональных компьютеров на GPSS + Отчет + Б...
Моделирование работы ЭВМ на GPSS + Пояснительная записка

Реклама



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

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Еext Editor
Редактор анимаций
С. Г. Горнаков - ...
GamesBase 3.0
CoolControls v3.0...
Электронный магаз...
Стелтинг Стивен, ...
Карта сайта
Разработка интерн...
PDPcheck
PolyFlow
SUIPack
Панель "Случайное...
PHP в примерах
База англоязычных...
WinAmp
Info
PDJ_Anima
AntiRus
Tenis [Исходник н...

Топ загрузок
Приложение Клие... 100466
Delphi 7 Enterp... 86635
Converter AMR<-... 20077
GPSS World Stud... 12649
Borland C++Buil... 11759
Borland Delphi ... 8556
Turbo Pascal fo... 7037
Visual Studio 2... 4998
Калькулятор [Ис... 4760
FreeSMS v1.3.1 3541
Случайные статьи
Настройки обсуждения
Советы дизайнеру, ...
Что есть у большин...
Как выбрать хостин...
Архитектура Ethern...
DMZ).• Сервер DNS.
Поток информации и...
Получи www.anythin...
Перекрестный контроль
Средства обработки...
или общественной
Запись текста в до...
Вызов функции poor
Эпилог ко второму ...
Undefined external
Максимальная нагля...
Легенда ждет вас -...
Печать
Реализация обобщен...
АНТИПАТТЕРНЫ ЗАПРОСОВ
Расширение
функции AddDetails
Как определить раз...
Сборка. Продолжение
Сложение и вычитание
Статистика



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


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