Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

private vs protected   Найти похожие ветки 

 
WebErr ©   (2004-04-21 16:24) [0]

Кто-нибудь скажет мне, зачем вообще нужна private-часть, когда всегда можно обойтись более гибкой protected?


 
Dimka Maslov ©   (2004-04-21 16:26) [1]

прочитай про ООП основополагающие понятия - наследование, полиморфизм и инкапсуляция. Читать надо до просветления


 
Игорь Шевченко ©   (2004-04-21 16:28) [2]


> зачем вообще нужна private-часть, когда всегда можно обойтись
> более гибкой protected


Для запрета видимости наследникам реализации класса-предка.


 
Goida ©   (2004-04-21 16:33) [3]

Вообще, это всё для удобства программирования. Это актуально когда работаешь в команде или предпологается, что твой код будет смотреть кто-то другой...


 
Digitman ©   (2004-04-21 16:36) [4]


> более гибкой protected


она для тебя "гибкая"

а для стороннего разработчика, которому ты даешь право унаследоваться от твоего опорного класса - это великий соблазн залезть туда, куда ему не следует лазить по твоей логике как разработчика алгоритма поведения опорного класса

вот ты, к примеру, в опорном классе объявил некое защищенное поле и в конструкторе присвоил ему значение = 1 ... при этом подразумевая, что это есть некая "константа", равная присвоенному единожды значению на всем протяжении жизни объекта, при котором гарантируется работоспособность заложенной тобой логики ... далее ты отдал/продал/подарил свой DCU другому разработчику, никак не документировав упомянутое поле, но при этом разрешив доступ к нему в классах-наследниках ... тот самый другой разработчик, коль скоро ты разрешил доступ к полю, возьмет да изменит его значение по своему усмотрению (мало ли что ему в голову стукнет ! ты же это никак не ограничил) ... и что дальше ? а дальше ситуация у стороннего разработчика в его классе-наследнике выходит из под контроля, вплоть до полной неработоспособности объектов его класса !


 
WebErr ©   (2004-04-21 16:37) [5]


> Dimka Maslov ©   (21.04.04 16:26) [1]

Я не хуже многих и многих здесь разбираюсь в ООП, а вот просветление светит не многим! :))))

> Игорь Шевченко ©   (21.04.04 16:28) [2]

Хоть один пример, когда нужно запретить наследнику пользоваться переменными предка будьте любезны! :))))


 
Тимохов ©   (2004-04-21 16:39) [6]


> Я не хуже многих и многих здесь разбираюсь в ООП, а вот
> просветление светит не многим! :))))

не похоже (судя по вопросу).

> Хоть один пример, когда нужно запретить наследнику пользоваться
> переменными предка будьте любезны! :))))

еще лучше.

Вы чую очень хотите получить значок Л под номером АВ-000001?
:))) Оно надо ?


 
Игорь Шевченко ©   (2004-04-21 16:45) [7]


> Я не хуже многих и многих здесь разбираюсь в ООП, а вот
> просветление светит не многим


Я извиняюсь, но у меня противоположное впечатление.

Впрочем, есть выход: на www.brainbench.com остался, вроде, бесплатный тест по ООП. Рекомендую пройти, чтобы укрепиться/усомниться в своих мыслях.


 
WebErr ©   (2004-04-21 16:45) [8]


> Тимохов ©   (21.04.04 16:39) [6]

Мда!
Как минимум голословно!
Потомок тем и хорош, что получает от "отца" его свойства и методы, зачем же ему что-то запрещать???
Не знаю - не знаю!!! :))))


 
WebErr ©   (2004-04-21 16:46) [9]


> Игорь Шевченко ©   (21.04.04 16:45) [7]

Всё-таки, хоть один пример!
Мне почему-то всегда очень жаль не давать наследнику что-то, что есть в предке...


 
Romkin ©   (2004-04-21 16:49) [10]

protected тоже нафиг не нужен, есть же более гибкий раздел public... Вот его только и надо пользовать!


 
WebErr ©   (2004-04-21 16:51) [11]


> Romkin ©   (21.04.04 16:49) [10]

public не защищает от внешних модулей! :(


 
Игорь Шевченко ©   (2004-04-21 16:53) [12]


> public не защищает от внешних модулей! :(


А protected защищает ? Бегом на brainbench


 
Тимохов ©   (2004-04-21 16:54) [13]


> WebErr ©   (21.04.04 16:51) [11]
>
> > Romkin ©   (21.04.04 16:49) [10]
>
> public не защищает от внешних модулей! :(

впрочем как и protected.

Скажите вы когда были маленький, вам очень хотелось знать (вернее было нужно) как вас сделали? Вам что непременно было знать все физиологию? Сделали - и на том спасибо, а как - скрыто в объекте класса "пара папа+мама".


 
WebErr ©   (2004-04-21 16:54) [14]


> WebErr ©   (21.04.04 16:37) [5]

Sorry если кого-то обидел, просто Object Pascal и С++ используют совсем не идентичный подход к ООП, а ООП я изучал именно на С++. !


 
Palladin ©   (2004-04-21 16:57) [15]

А почему тебе не жаль давать в public все что есть вообще?


 
Goida ©   (2004-04-21 16:58) [16]

А зачем нам вообще, в таком случае, что-то запрещать?

> WebErr

Скажи, зачем тебе protected?


 
Anatoly Podgoretsky ©   (2004-04-21 16:58) [17]

Romkin ©   (21.04.04 16:49) [10]
public тоже нафиг не нужен, есть же более гибкий раздел published... Вот его только и надо пользовать!


 
WebErr ©   (2004-04-21 16:58) [18]


> впрочем как и protected

Это только в Паскале! :))))
Всё - понял, почему вы так за него держитесь! :))))


 
Игорь Шевченко ©   (2004-04-21 16:59) [19]


> Sorry если кого-то обидел, просто Object Pascal и С++ используют
> совсем не идентичный подход к ООП


Можно узнать, в чем разница ?


 
Тимохов ©   (2004-04-21 16:59) [20]


> Можно узнать, в чем разница ?

во-во мне тоже интересно


 
WebErr ©   (2004-04-21 17:00) [21]


> Скажите вы когда были маленький, вам очень хотелось знать
> (вернее было нужно) как вас сделали? Вам что непременно
> было знать все физиологию? Сделали - и на том спасибо, а
> как - скрыто в объекте класса "пара папа+мама".

А если нельзя а очень-очень хочется узнать?!


 
Digitman ©   (2004-04-21 17:02) [22]


> WebErr ©   (21.04.04 16:54) [14]


да хоть на Си + сто плюсов !! суть ООП от этого нисколько не меняется

TBaseClass = class
private
F1: Integer;
protected
procedure SetField(Value: Integer);
end;

procedure TBaseClass.SetField(Value: Integer);
begin
 if некоторое_условие then
   F1 := Value;  
...
end;

TDescClass = Class(TBaseClass)
..
procedure SomeProc;
end;

procedure TDescClass.SomeProc;
begin
 F1 := хрен_знает_что; // а запросто ! ведь оно - защищенное !
 Setfield(хрен_знает_что); // а вот тут далеко не запросто ! ибо классу TDescClass не дано ничего знать об некоторое_условие - не его это собачье дело !
end;


 
WebErr ©   (2004-04-21 17:03) [23]


> Игорь Шевченко ©   (21.04.04 16:59) [19]

Учиться, учиться и ещё раз учиться!
Доступа нет в С++ к protected части ни у кого, кроме наследников и friends. Friends в свою очередь имеют доступ и к private, так нафиг тогда такой private?


 
WebErr ©   (2004-04-21 17:03) [24]

В общем - я домой! ... Закладку поставлю... глядишь что-нибудь умное напишут (в конце-концов!)


 
Тимохов ©   (2004-04-21 17:05) [25]

зачем вам умное - программистом вам не стать, т.к. программист домой в 17-00 не ходит - он ботает, не все конечно, некторые уже отботали, но вам точно это нужно.

:)))


 
Goida ©   (2004-04-21 17:16) [26]


> WebErr

У тебя подход к этой проблеме не верный. Надеюсь, что дома ты откроешь книгу по ООП и посмотришь, зачем вообще были сделаны эти public, private и protected. Для программы они вообще не существуют. Friends - такой этот френдз. Поэтому и думать надо прежде чем что-то куда-то писать. Да и вообще нужно думать... А не просто так...


 
Игорь Шевченко ©   (2004-04-21 17:16) [27]


> Учиться, учиться и ещё раз учиться!


Спасибо за рекомендацию, не премину воспользоваться.

Только вот один момент мне непонятен - чем реализация friends так уж сильно отличается от совместного использования классами, находящимися в одном модуле, внутренностей друг друга ? Еще учитывая, что в С++ модулей, как таковых, нету.


 
Юрий Зотов ©   (2004-04-21 17:26) [28]

> WebErr

Вы хотели пример? Пожалуйста - совершенно стандартный пример.

type
 TMyControl = class(TCustomControl)
 private
   FColor: TColor;
   procedure SetColor(const Value: TColor);
 public
   constructor Create(AOwner: TComponent); override;
 published
   property Color: TColor
     read FColor write SetColor default clWindow;
 end;

constructor TMyControl.Create(AOwner: TComponent);
begin
 inherited;
 FColor := clWindow
end;

procedure TMyControl.SetColor(const Value: TColor);
begin
 if FColor <> Value then
 begin
   FColor := Value;
   Invalidate
 end
end;

Теперь поразмыслите - можно ли (и стоит ли) выносить поле FColor и метод SetColor в любую другую секцию, кроме private?

А если это Вас не убедит, то напишите несколько своих компонентов. Но как положено - то есть, предполагая, что пользоваться ими будет кто угодно, а поддерживать их придется Вам, как разработчику. Вот тут-то Вы и поймете, зачем нужна секция private.


 
Гаврила   (2004-04-21 17:29) [29]


> Anatoly Podgoretsky ©   (21.04.04 16:58) [17]
> Romkin ©   (21.04.04 16:49) [10]
> public тоже нафиг не нужен, есть же более гибкий раздел
> published... Вот его только и надо пользовать!


published тоже нафиг не нужен, есть более гибкий раздел - глобальные переменные


 
Тимохов ©   (2004-04-21 17:31) [30]


> Гаврила   (21.04.04 17:29) [29]

предлагаю файл в "c:\" или в "с:\winnt"


 
panov ©   (2004-04-21 17:38) [31]

>Тимохов ©   (21.04.04 17:31) [30]

предлагаю файл в "c:\" или в "с:\winnt"

Не, в фал не надо... лучше в реестре все держать или файлы в память проецировать...


 
vl_chel ©   (2004-04-21 17:41) [32]

Разница в парадигмах ООП Object Pascal и С++
1) паскаль использует ссылочную модель объектов
2) в паскале конструкторы и деструкторы автоматически не вызываются
3) Паскаль не поддерживает множественного наследования (оно возможно только через интерфейсы,
можно включением нужных классов в свой и выводом свойств на поверхность - но это не наследование)
4) в паскале нет понятия дружественных классов, но тоже самое получается когда классы расположены в одном модуле
5) в паскале нет отдельного понятия копирующего конструктора, используется метод Assign

Поправте если что забыл, но в остальном все одинаково за исключением синтаксиса языка

Очень хочется отца этой ветки переадресовать к книге Страуструпа С++ и книге М.Кенту Delphi 6 для проффесионалов (авторов с хорошим описанием ООП для паскаля много)


 
Гаврила   (2004-04-21 17:51) [33]

>>vl_chel ©   (21.04.04 17:41) [32]

ИЗ всего перечисленного значимым является только пункт 3


 
Тимохов ©   (2004-04-21 17:52) [34]


> ИЗ всего перечисленного значимым является только пункт 3

для вас? или для всех?


 
Гаврила   (2004-04-21 17:57) [35]

>>Тимохов ©   (21.04.04 17:52) [34]
Как разница в парадигмах ООП. Остальные отличия не существенны с точки зрения этой самой парадигмы


 
Тимохов ©   (2004-04-21 18:01) [36]


> Гаврила   (21.04.04 17:57) [35]

согласен, но я бы еще отнес пункт про авт. вызов конструкторов.


 
Игорь Шевченко ©   (2004-04-21 18:02) [37]


> ) в паскале нет отдельного понятия копирующего конструктора,
> используется метод Assign


А в C++ есть ? Как элемент языка ? Не верю.


 
Goida ©   (2004-04-21 18:32) [38]


> Игорь Шевченко

Точно не известно, что имел автор этого поста ввиду (
> в паскале нет отдельного понятия копирующего конструктора,
>
> > используется метод Assign

). Но и там и там нужно писать отдельный метод. А как он называется, это дело 10е. В поём языке - копирксерокс.


 
Jack128 ©   (2004-04-21 19:29) [39]


> Юрий Зотов ©   (21.04.04 17:26)
С полем  все понятно, а вот насчет метода - нет, к SetColor мы так и так имеем доступ через свойство Color, поэтому куда мы этот метод вынесем: в protected или даже в public принципиальной разницы ИМХО нет..(но саму идею private секции я не отрицаю ;-))


 
Palladin ©   (2004-04-21 19:51) [40]

необходимо рассматривать private и protected в том же ракурсе что и protected и public... ничто и никто нам не мешает выносить абсолютно все в public... если автору поста хочется иметь толпу полей и методов доступных наследнику, то, боже мой, кто ему запрещает...



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

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.026 c
1-1083748602
Романов Р.В.
2004-05-05 13:16
2004.05.23
Организация вывода сообщения об ошибке


14-1083477640
Ig
2004-05-02 10:00
2004.05.23
Вопрос по компонентам, точнее по созданию редактора свойств.


1-1083763502
denis_group
2004-05-05 17:25
2004.05.23
CheckBox ы в StringGrid .


3-1083090923
Михалычъ
2004-04-27 22:35
2004.05.23
Передвижение по полям


1-1084047903
nkoleda
2004-05-09 00:25
2004.05.23
Excel и примечание