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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.043 c
8-1078386896
Petro
2004-03-04 10:54
2004.05.23
Подскажите компонент "Далее-Назад" Wizard!


14-1083239512
Соловьев
2004-04-29 15:51
2004.05.23
Вирус?


7-1081755929
Katya_mgkit
2004-04-12 11:45
2004.05.23
Служба


3-1083074531
AlexBalex
2004-04-27 18:02
2004.05.23
Обновление указанной записи с помощью resync


1-1084124365
TNewb
2004-05-09 21:39
2004.05.23
Опять StringGrid





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