Форум: "Потрепаться";
Текущий архив: 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.011 c