Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизДиректива friend в Object Pascal !!! Найти похожие ветки
← →
WebErr (2004-02-03 17:40) [0]В языке C++ имеется специальный keyword friend, который очень помогает во многих ситуациях. Мне бы хотелось узнать, есть ли что-нибудь подобное в Object Pascal? Директива friend в C++ позволяет функции или даже целому классу использовать private и protected часть данного класса, в котором объявлен friend.
← →
Тимохов (2004-02-03 17:42) [1]В дельфи такой нет.
Зато можешь использовать все, что хочешь в рамках одного модуля.
← →
Skier (2004-02-03 17:44) [2]Удалено модератором
Примечание: Оффтоп...
← →
WebErr (2004-02-03 18:01) [3]Удалено модератором
Примечание: Оффтоп...
← →
Внук (2004-02-03 18:17) [4]В пределах одного модуля все классы являются дружественными по отношению друг к другу. И это все.
← →
Юрий Зотов (2004-02-03 18:22) [5]> WebErr © (03.02.04 17:40)
Доступ к секции protected получить все же можно, причем совершенно легально. Если объявить:
type
TFriendClass = class(TSomeClass);
то ниже этого объявления, приводя объект класса TSomeClass к классу TFriendClass, получаем доступ к его protected-секции.
← →
Skier (2004-02-03 18:24) [6]>Юрий Зотов © (03.02.04 18:22) [5]
Ну это уже не дружественность, а...товарищество. :o)
← →
Ihor Osov'yak (2004-02-03 23:18) [7]2 [5]..
Хм.. Очччччень интересно....
Специально посмотрел в руководство:
A protected member is visible anywhere in the module where its class is declared and from any descendant class, regardless of the module where the descendant class appears. In other words, a protected method can be called, and a protected field or property read or written to, from the definition of any method belonging to a class that descends from the one where the protected member is declared. Members that are intended for use only in the implementation of derived classes are usually protected.
с. Classes and objects 7-5, Object Pascal Language Guide, D4.
Отсюда вывод о правомочности [5] как бы не следует. Ведь конкретно говорится только о видимости из любого класса-наследника (то бишь методов), вне зависимости от того, где этот класс декларируется. Но ни слова о технике, из [5].
Проверил экспериментально. КомпилЯтор не обиделся. То есть [5] имеет место быть. Вопрос все же в том, что это? Просто фича недокументированная? Или Юрий под "причем совершенно легально" понимал использование штатных конструкций безо всяких вывертов со смежениями и тд? Или все же легальная техника + мое неумение читать книжки?
Если последнее, то просьба - Юрий, если не трудно - дайте ссылку на оффициальный материал, типа странички в руководстве, можно маленькую цитату, етс..
Но по любому - спасибо.
← →
Германн (2004-02-03 23:35) [8]2 Ihor Osov"yak © (03.02.04 23:18) [7]
Не знаю как в книгах, но в исходниках VCL такие примеры встречаются.
← →
Ihor Osov'yak (2004-02-03 23:38) [9]2 [8] Германн © (03.02.04 23:35)
Книги в счет не принимаются :-), а вот исходники VCL - это уже аргумент.. Я, наверное, невнимательно смотрел. Если помните соотв. фрагмент, был бы благодарен за ссылку.
← →
Юрий Зотов (2004-02-03 23:41) [10]> Ihor Osov"yak © (03.02.04 23:18) [7]
Насчет легальности - прием этот можно неоднократно встретить в самой VCL. Тейксейра c Пачеко тоже его описывают.
А объяснение простое (и тоже указывает на легальность этого способа в рамках принятой в Delphi модели ООП).
Наследник вполне легально видит protected-секцию предка. А код в одном модуле с наследником тоже вполне легально видит protected-секцию этого самого наследника, даже если она никак по сравнениею с предком не изменена (то есть, в описании наследника эта секция просто отсутствует). Значит, код в одном модуле с наследником будет вполне легально видеть protected-секцию предка, но через наследника - то есть, после формального приведения предка к наследнику. А поскольку наследник тоже объявлен чисто формально (даже end писать не требуется), то он полностью совпадает с предком и такое приведение совершенно безопасно.
← →
Ihor Osov'yak (2004-02-03 23:44) [11]2 [10] Юрий Зотов © (03.02.04 23:41)
Логично. Я иногда бываю невнимателен при чтении первоисточников :-).
2 Германн
Моя просьба в [9] наверно уже потеряла актуальность..
Спасибо.
← →
WebErr (2004-02-04 16:51) [12][10] - оччень убедительно!
Спасибо большое! :)))))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c