![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Object Pascal: Как обьявить два взаимосвязанных класса ? [D6, Win95/98]
IGOREK © (2002-04-29 15:24:00)Уважаемые мастера. Прошу прощения за может быть простые вопросы
(только недавно перешел с C++ на Object Pascal)
Есть два взаимосвязанных класса напр.
A = class
procedure f(V: B);
end;
B = class
procedure f(V: A);
end;
Требуется их обьявить:
1) в одном модуле, но один класс должен быть видимым пользователям
модуля (в interface части), а другой нет
2) отдельно каждый в своем модуле
Причем обойтись без приведения типов, напр.
procedure B.f(V: TObject);
begin
A(V). ...
end;
Для первого случая я не знаю как сделать...
Для второго случая чтобы обойти ошибку "circular unit reference"
я не придумал ничего лучше приведения типов.
Спасибо, если кто откликнется.
P.S. А в С++ так все просто и элегантно...
IGOREK (2002-04-29 18:00:00) [1]2Anatoly Podgoretsky © (29.04.02 15:37)
> Тебе надо пересмотреть подход к классам, например иметь базовый класс с абстрактыми методами.
Да нет. Два класса совершенно разные и глупо делать общий базовый.
Кроме того так все равно без приведения типов не обойтись (хотя может тут я не прав).
У меня первый проект на Delphi (пакет компонентов).
Но очень часто всречается взаимное использование или аггрегация классов. Не сбивать же все в один модуль (как в VCL семейства классов сбиты).
Кроме того есть классы вспомогательные и не должны быть видны пользователю.
Вот такие проблеммы с Object Pascal.
И как только на нем грамотно писать сложные вещи?..
Может в новом стандарте будет лучше, но когда он будет?...
Игорь Шевченко (2002-04-29 17:13:00) [2]День добрый, Толик,
> Ну нельзя такую штуку реализовать в Делфях и всё
А очень надо? :-)
На хорошую иерархию классов Delphi ограничений не накладывает :-)
И я бы не стал категорично утверждать, что необходимость вызовов методов непрямого предка есть достоинство спроектированной иерархии классов (это про ту дискуссию).
С уважением,
Толик (2002-04-29 16:23:00) [3]to Игорь Шевченко ©:
Речь идёт не о плохой или хорошей иерархии классов, а об ограничениях, накладываемых Делфями. Ну нельзя такую штуку реализовать в Делфях и всё... И не потому что Делфи плохие, а потому что у любой проги есть свои ограничения. Дело в том, что подобные ограничения часто усложняют жизнь, а в Делфях они встречаются достаточно часто (вспомните недавний диалог про вызовы виртуальных ф-й и VMTOFFSET). Но если со всеми этими ограничениями так много людей используют Делфи, наверное что-то их привлекает? :)
Игорь Шевченко (2002-04-29 15:55:00) [4]День добрый, Толик ©,
И в C++ можно плохую иерархию классов спроектировать :-)
С уважением,
Толик (2002-04-29 15:46:00) [5]К сожалению, никак. Как вариант, можно предложить объявить второй класс в разделе implementation, тогда он будет виден только внутри этого unit"а (по аналогии с С++, когда объявляешь класс внутри другого класса)
PS. А вот в C++ действительно всё просто, ну так это всё-таки С++, а не что-нибудь...
Anatoly Podgoretsky (2002-04-29 15:37:00) [6]Это не получится никаким методом, допустим ты хочешь, что бы был видимым класс А, но он требует что бы был видимым класс B
Аналогично для второго класса.
Тебе надо пересмотреть подход к классам, например иметь базовый класс с абстрактыми методами.
DieHard (2002-04-29 15:32:00) [7]type
B=class;
A = class
procedure f(V: B);
end;
B = class
procedure f(V: A);
end;