Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.27;
Скачать: CL | DM;

Вниз

Переопределение методов   Найти похожие ветки 

 
Tsr   (2003-01-11 12:02) [40]

А можно ссылочку, где по Object Pascal ?


 
Сатир ©   (2003-01-11 15:30) [41]

вообщем, вставлю и я свои "5 копеек"
override - значит, обнулять, аннулировать
и если стоит этот спецификатор, то все действия, кторые были описаны в предке, будут обнулены.
Но если всё-таки возникнет необходимость их вызвать в наследнике, то воизбежание перенабирания кода, который есть в предке, используется директива inherited
а если этой директивы не будет, то Вы получите следующую ошибку:
Unsatisfied forward or external declaration: "<имя метода, который был переобъявлен в наследнике>"


 
Игорь Шевченко ©   (2003-01-11 15:50) [42]

Сатир © (11.01.03 15:30)

> override - значит, обнулять, аннулировать


Где такая трава растет, поделись ?

override всю жизнь был "Перекрывать"


 
Сатир ©   (2003-01-11 15:57) [43]

2Игорь Шевченко © (11.01.03 15:50)
главное смысл
а если хотите, чтоб и Вас так заколбасило, переведите сабж с помощью Лингво 7 или Сократ 97, там, правда, мне сказали:"аннулируйтесь".
Гы.


 
Игорь Шевченко ©   (2003-01-11 16:03) [44]

Сатир © (11.01.03 15:57)

Смысл напрочь искажен.
Впрочем, тому же Stylus"у были скормлены строчки:
Daddy"s flown across the ocean
Leaving just a memory
A snapshot in the family album...

И гарантировано полчаса здорового смеха :-))


 
Tsr   (2003-01-11 16:06) [45]

Где можно подробно почитать про VMT ?

хотелось бы прочитать про механизм реализации статических, виртуальных и динамических методов, чтобы лучше понять их природу


 
Игорь Шевченко ©   (2003-01-11 16:13) [46]

Tsr (11.01.03 16:06)

Тейксейра, Пачеко: "Delphi 5. Руководство разработчика"
Object pascal language guide.
Исходные тексты Source\Rtl\Sys\system.pas
Отладчик.

Удачи!


 
Tsr   (2003-01-11 16:55) [47]

Игорь Шевченко, а в книге этих авторов по D5 это есть ? У меня книга по D6 - там как-то особо не описано...


 
Игорь Шевченко ©   (2003-01-11 17:13) [48]

Tsr (11.01.03 16:55)

К книге по D6 на компакте прилагается книга по D5. Есть.


 
vuk ©   (2003-01-11 17:54) [49]

to Игорь Шевченко:
>Где такая трава растет, поделись ?
Какая ж зимой трава? Зимой - грибы! :o)

to Tsr:
>Где можно подробно почитать про VMT ?
Попробовать вкратце объяснить что ли?

Для начала про статические методы (не путать со static в C++) т.к. они самые простые - когда делается взов статического метода, компилятор генерирует обычные вызов процедуры по определенному адресу.

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

TBaseClass = class
procedure Foo; virtual;
procedure Bar; virtual;
end;

тогда какой-то фрагмент VMT (для упрощения буду рассматривать только фрагмент, а не всю VMT, поскольку для понимания того, как это работает не важно - рассматривается VMT целиком или только её фрагмент) схематично будет выглядеть так:
...
[@TBaseClass.Foo]
[@TBaseClass.Bar]
...

Когда где-то в коде написан вызов виртуального метода, например Foo, компилятор сгенерирует код, который извлекает из определенной ячейки VMT нужный адрес (TBaseClass.Foo) и потом происходит вызов по этому адресу.


Теперь предположим, что мы определили наследника от TVaseClass:

TSomeNewClass = class(TBaseClass)
procedure Foo; override;
end;

Для этого класса компилятор сгенерирует VMT, где интересующий нас фрагмент будет выглядеть так:
...
[@TSomeNewClass.Foo]
[@TBaseClass.Bar]
...
То есть структора VMT наследника поврторяет структуру VMT предка, и в ней замещены адреса, соответствующие переопределенным методам. Теперь, когда будет происходить вызов метода Foo, из VMT будет извлечен адрес метода TSomeNewClass.Foo.


Теперь немного про динамические. В больших программных системах со сложными иерархиями и большим количеством виртуальных методов возникают классы, у которых имеются очень большие VMT, где методы переопределяются редко и это приводит к потерям памяти на хранение этих таблиц. Вот как раз эту проблему и решают введением динамических методов.

По сути своей динамические методы не сильно отличаются от виртуальных, но есть некоторые отличия.
Для этого применяются следующие меры:

1. У каждого динамического метода есть неявно назначаемый компилятором индекс.
2. Каждый элемент таблицы динамических методов (DMT) содержит, помимо адреса метода, также его индекс и хранится отдельно от VMT.
3. DMT для класса содержит только адреса только тех методов, что были переопределены либо заново введены в этом классе.


Схематический пример построения структуры DMT.
Есть классы:

TBaseClass = class
procedure Foo; dynamic;
procedure Bar; dynamic;
end;

TSomeNewClass = class(TBaseClass)
procedure Foo; override;
end;

Пусть компилятор присвоил Foo индекс 1, а Bar - 2.

Тогда структуры DMT будут следующие (схемстично):
Для TBaseClass
...
[1; @TBaseClass.Foo]
[2; @TBaseClass.Bar]
...

Для TSomeNewClass
...
[1; @TSomeNewClass.Foo]
...

При этом у каждого экземпляра объекта в VMT есть ссылка на DMT для этого класса. Вызов динамического метода происходит так:
1. Получается адрес DMT класса.
2. В DMT ищется адрес метода с нужным индексом.
3. Если адрес найден, то делается вызов, иначе же поиск производится последовательно в DMT классов-предков.

В приведенном выше примере при вызове Bar у экземпляра TSomeNewClass сначала будет произведено сканирование DMT TSomeNewClass, но поскольку метод с нужным индексом там не найден, будет просмотрена DMT TBaseClass и вызван метод TBaseClass.Bar.

Добавлю еще, что методы с модификатором message, это по сути те же динамические методы и располагаются они в тех же самых DMT, но для них явно назначается индекс для DMT и этим индексом является код сообщения Windows.




Страницы: 1 2 вся ветка

Текущий архив: 2003.01.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.016 c
1-86748
Junior
2003-01-17 15:26
2003.01.27
Есть ListBox, в нем заполненые поля, как вызвать PopupMenu


9-86609
Alex_D
2002-07-29 16:18
2003.01.27
Графика


1-86860
Johnny Split
2003-01-18 10:25
2003.01.27
Защита программного обеспечения


1-86931
Hopkins
2003-01-12 17:46
2003.01.27
Как из Delphi вносить изменения в окнах апплетов (Св-ва обозр.)?


1-86772
IronWit
2003-01-17 17:44
2003.01.27
как ввести в edit.text байтовые символы