Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.012 c
4-87204
Hill1
2002-12-05 17:42
2003.01.27
CreateProcess


1-86916
МитяЙ2
2003-01-14 22:00
2003.01.27
Возврат из процедуры (функции)


1-86763
Th
2003-01-16 20:11
2003.01.27
Работа с TScrollBox


14-87136
Странник
2003-01-10 11:41
2003.01.27
Глюки :-)


14-87027
Igor_thief
2003-01-10 18:43
2003.01.27
Окно заставка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский