Текущий архив: 2004.08.29;
Скачать: CL | DM;
Вниз
А вот зачем... Найти похожие ветки
← →
vecna © (2004-08-11 18:26) [0]... в Дельфях классы объявленные в одном юните становятся дружественными ? Скока пишу, все никак не пойму нафига так сделали.
← →
Anatoly Podgoretsky © (2004-08-11 18:31) [1]Давай дружить
← →
able © (2004-08-11 18:32) [2]
> Давай дружить
:)))
===
""Смысл жизни состоит в том, чтобы умело скрывать её бессмысленность"" (с) Даль. http://www.maxx-ch.net
← →
VMcL © (2004-08-11 18:35) [3]>>vecna © (11.08.04 18:26)
А как бы ты хотел?
← →
DiamondShark © (2004-08-11 18:43) [4]Потому что модуль -- это единица инкапсуляции.
← →
pasha_golub © (2004-08-11 18:46) [5]DiamondShark © (11.08.04 18:43) [4]
Можно для непонятливых развернутое объяснение?
← →
DiamondShark © (2004-08-11 18:47) [6]Вообще, вопрос не корректный.
Правильно спрашивать так: "Почему в цэ с крестами потребовалось вводить понятие дружественности?"
← →
pasha_golub © (2004-08-11 18:48) [7]Потому что модуль -- это единица инкапсуляции.
Не могу догнать. Как по мне совершенно безсмысленная фраза.
С уважением.
← →
Ega23 © (2004-08-11 18:54) [8]Заводи на каждый класс отдельный юнит и будет тебе счастье.
← →
DiamondShark © (2004-08-11 19:07) [9]
> pasha_golub © (11.08.04 18:48) [7]
Модуль -- програмная единица, имеющая внешний интерфейс и компилируемая (и разрабатываемая!) как единое целое.
Теперь внимание, вопрос: если модуль -- это целое, доступ к которому возможен исключительно через описанный интерфейс, то нафига внутри модуля нужно ещё что-то скрывать от самого себя?
В сях понятие модульности отсутствует, программа собирается фактически как один большой текст, а единицей инкапсуляции (т.е. целым с описанным интерфейсом) является класс. Отсюда и введение понятия дружественности.
← →
DiamondShark © (2004-08-11 19:11) [10]
> Ega23 © (11.08.04 18:54) [8]
> Заводи на каждый класс отдельный юнит и будет тебе счастье.
Не будет счастья. Дружественности всё равно не получится.
Да и не нужна она.
Если классам надо лазить в потроха друг друга, значит они представляют собой тесно связанные сущности, требуют знания детального внутреннего устройства, а значит им самое место в одном модуле, ибо друг без друга они всё равно существовать не могут.
← →
Ega23 © (2004-08-11 19:20) [11]Дружественности всё равно не получится.
Так и я про то же. Просто, насколько я понял, автора сабжа "кумарит" это свойство.
Да и не нужна она.
Полностью согласен. ИМХО, это как GoTo использовать. Бывает, что проще, но в целом противоречит самой идее ООП.
← →
GuAV © (2004-08-11 19:29) [12]А нафига protected становятся видны не тока в методах наследника, но и повсеметсно в модуле?
← →
DiamondShark © (2004-08-11 20:26) [13]
> GuAV © (11.08.04 19:29) [12]
> А нафига protected становятся видны не тока в методах наследника,
> но и повсеметсно в модуле?
Потому что модуль -- это единица инкапсуляции.
← →
TUser © (2004-08-11 20:27) [14]Чтобы сишникам лучше жилось
← →
nasty © (2004-08-11 21:30) [15]to [Anatoly Podgoretsky, 1]
во как, а со мной не хочешь -(
← →
KSergey © (2004-08-12 00:32) [16]> DiamondShark © (11.08.04 19:07) [9]
Здорово, логично...
← →
SPeller © (2004-08-12 06:54) [17]
> А нафига protected становятся видны не тока в методах наследника,
> но и повсеметсно в модуле?
Даже private доступно внутри модуля кому угодно.
← →
vecna © (2004-08-12 10:06) [18]>VMcL ©
>А как бы ты хотел?
я бы хотел явного указания кто кого дружит, но оно мне жить вообщем не мешает.
Но это все демагогия, я просто так спросил, в пику темам "почему i переменная цикла", "что делать с варнингами и хинтами" и прочими идеологическими вопросами.
← →
VMcL © (2004-08-12 10:09) [19]>>vecna © (12.08.04 10:06) [18]
>я бы хотел явного указания кто кого дружит
См. [9].
← →
Anatoly Podgoretsky © (2004-08-12 10:10) [20]Зачем Таня дружит с Вовой и Петей
← →
Ega23 © (2004-08-12 10:13) [21]Зачем Таня дружит с Вовой и Петей
Нимфоманка?
← →
olookin © (2004-08-12 10:14) [22][20] Anatoly Podgoretsky © (12.08.04 10:10)
Зачем Таня дружит с Вовой и Петей
Бред в середине рабочей недели не есть признак здраво проживаемого времени...
← →
Игорь Шевченко © (2004-08-12 10:14) [23]
> я бы хотел явного указания кто кого дружит
кто против кого дружит.
← →
Igorek © (2004-08-12 10:35) [24]Лишнее доказательство того как Обьектный Паскаль "поддерживает" ООП.
← →
Иван Шихалев © (2004-08-12 10:41) [25]
> Igorek © (12.08.04 10:35) [24]
> Лишнее доказательство того как Обьектный Паскаль "поддерживает"
> ООП.
Лишний пример того, как некоторые путают ООП и ЦПП.
← →
Romkin © (2004-08-12 10:44) [26]SPeller © (12.08.04 06:54) [17] Да. К сожалению, доступна и private секция.
Так сложилось исторически: в Borland Pascal были только секции private и public. Так что для обратной совместимости. На мой взгляд, вполне достаточно было бы открыть доступ только к protected секции. К сожалению, дружественные классы иногда очень удобны, хотя я никогда этим и не пользовался (а вот Борланд - злоупотребляет!) :)
← →
Igorek © (2004-08-12 10:54) [27]
> Иван Шихалев © (12.08.04 10:41) [25]
> > Igorek © (12.08.04 10:35) [24]
> > Лишнее доказательство того как Обьектный Паскаль "поддерживает"
> > ООП.
> Лишний пример того, как некоторые путают ООП и ЦПП.
Лишний пример "додумывания" смысла - не было ни слова о С++.
← →
Ega23 © (2004-08-12 10:56) [28]А в ООП, насколько я помню, нет понятия дружественности.
Есть Инкапсуляция, есть Наследование, есть Полиморфизм.
← →
nasty © (2004-08-12 11:06) [29]кто с кем дружит, тот того и танцует
← →
Иван Шихалев © (2004-08-12 11:18) [30]
> Лишний пример "додумывания" смысла - не было ни слова о
> С++.
Хорошо, переформулирую - лишний пример того, как некоторые путают ООП и черте-что.
← →
KSergey © (2004-08-12 11:29) [31]> Romkin © (12.08.04 10:44)
> На мой взгляд, вполне достаточно было бы открыть доступ
> только к protected секции.
К ней и так есть доступ - в наследниках.
Этим дружественные классы и отличаются от наследников, на сколько я понимаю
← →
Mike_Goblin (2004-08-12 13:01) [32]Уточните плиз о какой версии Delphi идет речь?
В 7.1 и выше введено ключевое слово strict, которое запрещает доступ к секции из того же модуля.
Пример
TMyObject = class
strict protected
........
← →
KSergey © (2004-08-12 13:28) [33]> [32] Mike_Goblin (12.08.04 13:01)
Меньше 7.1
Это следует из вашего поста ;)
Для полной корректности скажу, что про версии меньше 5 - ничего не знаю, сказать не могу.
← →
Яод (2004-08-12 13:32) [34]А вот мне хочется объявить класс так, чтобы следующий за ним, был привязан к предыдущему, а вот никто больше бы с предыдущим не дружил, даже не видел, но в Дельфи это нереально
← →
Rem (2004-08-12 14:28) [35]Насчет идеологических нарушений ООП в Object Pascal и VCL.
1. Вам не кажется, что методыTComponent.InsertComponent();
TComponent.RemoveComponent();
лучше не размещать в public-секции? Что перекрестная регистрация двух объектов - личное дело этих двух объектов, и никакой третий объект не должен иметь возможности вмешиваться в этот процесс?
Попробуйте:var
procedure TForm1.Button1Click(Sender: TObject);
P: TButton;
begin
P := Button1;
P.Name := "";
InsertComponent(P);
end;
Или в этом коде есть что-то противозаконное?
Почему в коде:
procedure TComponent.InsertComponent(AComponent: TComponent);
begin
// 1
AComponent.ValidateContainer(Self);
ValidateRename(AComponent, "", AComponent.FName);
Insert(AComponent);
AComponent.SetReference(True);
if csDesigning in ComponentState then
AComponent.SetDesigning(True);
Notification(AComponent, opInsert);
end;
- нет на месте 1 элементарной строчки:
if (AComponent.FOwner <> nil) then AComponent.FOwner.RemoveComponent(AComponent);(?)
- или хотя бы
if (FComponents.IndexOf(AComponent) < 0) then Exit;(?)
2. А вот такой метод:
procedure TComponent.Insert(AComponent: TComponent);
begin
if FComponents = nil then FComponents := TList.Create;
FComponents.Add(AComponent);
AComponent.FOwner := Self; // см. сюда
end;
идеологически нарушает инкапсуляцию. Хотя никаких нарушений с точки зрения Object Pascal нет, но тут один объект без зазрения совести меняет значение поля другого объекта. Хоть класс тот же, но поведение неправильное. Ведь, в конце концов, это OOP - Object Oriented Programming, а не Class Oriented. И таких примеров множество...
← →
Игорь Шевченко © (2004-08-12 14:46) [36]
> - нет на месте 1 элементарной строчки:
> if (AComponent.FOwner <> nil) then AComponent.FOwner.RemoveComponent(AComponent);(?)
> - или хотя бы
> if (FComponents.IndexOf(AComponent) < 0) then Exit;(?)
А что, кто-то мешает переписать в наследнике ValidateInsert ?
← →
DiamondShark © (2004-08-12 14:55) [37]
> Яод (12.08.04 13:32) [34]
> А вот мне хочется объявить класс так, чтобы следующий за
> ним, был привязан к предыдущему, а вот никто больше бы с
> предыдущим не дружил, даже не видел, но в Дельфи это нереально
А зачем?
← →
Sandman25 © (2004-08-12 15:21) [38][37] DiamondShark © (12.08.04 14:55)
type
TMyField = (mf1. mf2);
TForm = class
...
private
FField: TMyField;
...
Нафига открывать TMyField, если оно используется только в private?
← →
Kerk © (2004-08-12 15:23) [39]
> я бы хотел явного указания кто кого дружит
:) Это как?
← →
Яод (2004-08-12 15:34) [40]DiamondShark ©
потому как вспомогательный, если есть приватные переменные, как скрывать-то их реализацию? Я видел способы, даже официальные, но все равно несколько неудобно, как чесать спину правой рукой слева
← →
Serrrrg (2004-08-12 16:16) [41]Вот вспомнилось. Ветка навеяла :)
C++ was designed by someone who thinks
that the reason for friendship is so that
your friends can touch your private parts.
(c) Gareth McCaughan in comp.lang.lisp
← →
DiamondShark © (2004-08-12 16:16) [42]
> Sandman25 © (12.08.04 15:21) [38]
Так за пределами модуля его никто и не увидит.
А нафига его прятать в модуле?
← →
Sandman25 © (2004-08-12 16:19) [43][42] DiamondShark © (12.08.04 16:16)
Переменную не увидят, но тип увидят. А зачем? :)
← →
DiamondShark © (2004-08-12 16:39) [44]
> Sandman25 © (12.08.04 16:19) [43]
А это чем-то мешает? Ну увидят тип. И что?
> Яод (12.08.04 15:34) [40]
Ещё раз: зачем скрывать реализацию внутри модуля?
← →
Яод (2004-08-12 16:41) [45]DiamondShark ©
давайте все откроем!
мало ли, дело ж не в секретности, зачем бы тогда private придумывать
← →
Sandman25 © (2004-08-12 16:44) [46][44] DiamondShark © (12.08.04 16:39)
Ничего. Только инкапсуляция частично нарушается, и хакерам помощь.
← →
DiamondShark © (2004-08-12 16:57) [47]
> Яод (12.08.04 16:41) [45]
> DiamondShark ©
> давайте все откроем!
> мало ли, дело ж не в секретности, зачем бы тогда private
> придумывать
Ви, таки будете смеяться, но дело, таки да, не в секретности. А дело очень даже в разграничении внутреннего устройства, интерфеса девелопера и интерфейса юзера.
← →
nikkie © (2004-08-12 16:59) [48]таки для этого интерфейсы тогда подойдут?
скажем нет декларациям классов в interface section!
← →
Яод (2004-08-12 17:02) [49]DiamondShark ©
а я про что? вот и нужно разграничивать, так полностью.
Еще плохо, что юниты дружат только декларативными частями
← →
DiamondShark © (2004-08-12 17:12) [50]
> nikkie © (12.08.04 16:59) [48]
И очень даже вариант.
> Яод (12.08.04 17:02) [49]
А полнее и некуда.
Перестаньте рассматривать модуль как просто кусок текста, и всё встанет на свои места.
Страницы: 1 2 вся ветка
Текущий архив: 2004.08.29;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.026 c