Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-1090838604
Dalex
2004-07-26 14:43
2004.08.29
MySql


11-1080063843
Delphi5.01
2004-03-23 20:44
2004.08.29
Chem mojet bit vizvana oshibka: ExptIntf.dcu


4-1090172218
Makhanev A.S.
2004-07-18 21:36
2004.08.29
Как запустить службу сразу после её инсталляции?


1-1092653551
Gemini
2004-08-16 14:52
2004.08.29
Переменные в Run-Time


8-1086870848
Damage
2004-06-10 16:34
2004.08.29
Максимальные размеры TBitMap