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

Вниз

Object Pascal: Как обьявить два взаимосвязанных класса ?   Найти похожие ветки 

 
IGOREK   (2002-04-29 15:24) [0]

Уважаемые мастера. Прошу прощения за может быть простые вопросы
(только недавно перешел с 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. А в С++ так все просто и элегантно...


 
DieHard   (2002-04-29 15:32) [1]

type
B=class;

A = class
procedure f(V: B);
end;
B = class
procedure f(V: A);
end;


 
Anatoly Podgoretsky   (2002-04-29 15:37) [2]

Это не получится никаким методом, допустим ты хочешь, что бы был видимым класс А, но он требует что бы был видимым класс B
Аналогично для второго класса.
Тебе надо пересмотреть подход к классам, например иметь базовый класс с абстрактыми методами.


 
Толик   (2002-04-29 15:46) [3]

К сожалению, никак. Как вариант, можно предложить объявить второй класс в разделе implementation, тогда он будет виден только внутри этого unit"а (по аналогии с С++, когда объявляешь класс внутри другого класса)
PS. А вот в C++ действительно всё просто, ну так это всё-таки С++, а не что-нибудь...


 
Игорь Шевченко   (2002-04-29 15:55) [4]

День добрый, Толик ©,

И в C++ можно плохую иерархию классов спроектировать :-)

С уважением,


 
Толик   (2002-04-29 16:23) [5]

to Игорь Шевченко ©:
Речь идёт не о плохой или хорошей иерархии классов, а об ограничениях, накладываемых Делфями. Ну нельзя такую штуку реализовать в Делфях и всё... И не потому что Делфи плохие, а потому что у любой проги есть свои ограничения. Дело в том, что подобные ограничения часто усложняют жизнь, а в Делфях они встречаются достаточно часто (вспомните недавний диалог про вызовы виртуальных ф-й и VMTOFFSET). Но если со всеми этими ограничениями так много людей используют Делфи, наверное что-то их привлекает? :)


 
Игорь Шевченко   (2002-04-29 17:13) [6]

День добрый, Толик,


> Ну нельзя такую штуку реализовать в Делфях и всё

А очень надо? :-)

На хорошую иерархию классов Delphi ограничений не накладывает :-)

И я бы не стал категорично утверждать, что необходимость вызовов методов непрямого предка есть достоинство спроектированной иерархии классов (это про ту дискуссию).

С уважением,


 
IGOREK   (2002-04-29 18:00) [7]

2Anatoly Podgoretsky © (29.04.02 15:37)
> Тебе надо пересмотреть подход к классам, например иметь базовый класс с абстрактыми методами.

Да нет. Два класса совершенно разные и глупо делать общий базовый.
Кроме того так все равно без приведения типов не обойтись (хотя может тут я не прав).

У меня первый проект на Delphi (пакет компонентов).
Но очень часто всречается взаимное использование или аггрегация классов. Не сбивать же все в один модуль (как в VCL семейства классов сбиты).
Кроме того есть классы вспомогательные и не должны быть видны пользователю.
Вот такие проблеммы с Object Pascal.
И как только на нем грамотно писать сложные вещи?..

Может в новом стандарте будет лучше, но когда он будет?...



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

Форум: "Основная";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.004 c
1-39707
PaRL
2002-04-29 17:15
2002.05.13
Memo....


4-39907
samos
2002-03-12 14:28
2002.05.13
IPHLPAPI.dll кто нибудь знает с чем ее едят....


1-39726
Vano1
2002-04-27 12:11
2002.05.13
Как сохранить документ в формате XLS?


1-39747
BLiN
2002-04-27 17:53
2002.05.13
Как организовать задержку в Delphi меньше 1 мс


1-39722
SB.John
2002-04-27 11:04
2002.05.13
Как присвоить событию свою процедуру





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский