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

Вниз

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

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

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


 
Юрий Зотов ©   (2004-04-21 20:04) [41]

> Jack128 ©   (21.04.04 19:29) [39]

> куда мы этот метод вынесем: в protected или даже в public
> принципиальной разницы ИМХО нет..(

Вс же есть. Приватный метод не может быть переписан в наследнике - тем самым мы защищаем свой компонент от кривых рук его юзеров.


 
Jack128 ©   (2004-04-21 20:18) [42]


> Вс же есть. Приватный метод не может быть переписан в наследнике
> - тем самым мы защищаем свой компонент от кривых рук его
> юзеров.
?? Что изменит если в наследнике кто то перепишет SetChild??? Новый setColor будет вызываться только в коде наследнике и ничуть не повлияет на поведение предка

type
 TTest = class
 private
   FColor: TColor;
 protected
   procedure SetColor(const Value: TColor);
 public
   property Color: TColor read FColor write SetColor;
 end;

 TChildTest = class(TTest)
 protected
   procedure SetColor(const Value: TColor);
 end;

{ TTest }

procedure TTest.SetColor(const Value: TColor);
begin
 FColor := Value;
end;

{ TChildTest }

procedure TChildTest.SetColor(const Value: TColor);
begin
 inherited SetColor(Value);
 ShowMessage("SetColor in Child");
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 t: TChildTest;
begin
 t := TChildTest.Create;
 try
   t.Color := clRed; // никакого мессаджа не будет..
 finally
   t.Free;
 end;
end;

Я не хочу сказать что помещать методы в private не нужно, но то что статические мододы доступа обычно помещаются в private секцию ИМХО никакого отнашения к ООП не имеет, а объесняется ли нежеланием захламлять public/published секцию...


 
Anatoly Podgoretsky ©   (2004-04-21 20:37) [43]

Нет для того чтобы защищить реализацию этого метода, обход которого может быть чреват. Так что прямое отношение к ООП, а захламление все рано происходит, строчка с объявление, что в риват, что в протектед таже самая.


 
Jack128 ©   (2004-04-21 20:46) [44]


> обход которого может быть чреват.
каким образом можно обойти TTest.SetColor ?? При обрашении к свойству Color этого метола гарантирован, что бы там наследники не намудрили..

> захламление все рано происходит, строчка с объявление, что
> в риват, что в протектед таже самая.
я имел ввиду захламление для тех кто использует этот класс, как предка


 
Jack128 ©   (2004-04-21 20:52) [45]


> При обрашении к свойству Color этого метола гарантирован
читать как:
При обрашении к свойству Color вызов этого метода гарантирован


 
Юрий Зотов ©   (2004-04-21 21:09) [46]

> Jack128 ©   (21.04.04 20:18) [42]

Вы только дайте доступ - а я, опытный, злобный и хитрый юзверь Вашего компонента разберусь, как заменить Ваш метод своим. Адреса подменю, код в памяти скопирую, еще сто других способов найду - главное, доступ дайте.


 
Андрей Сенченко ©   (2004-04-21 21:13) [47]

Юрий Зотов ©   (21.04.04 21:09) [46]

А зачем ? Можете привести реальный пример жизненной необходимости такой подмены ? Просто пример. Компонент и его метод, который лично Вам хотелось бы подменить, да он на беду в protected.

Я без поддёвок - действительно интересно


 
Anatoly Podgoretsky ©   (2004-04-21 21:21) [48]

Ну например метод связан с проверкой защащенной информации, например серийных номеров, прав доступа и ни в коем случае не должен быть заменен другим методом.


 
Андрей Сенченко ©   (2004-04-21 21:25) [49]

Anatoly Podgoretsky ©   (21.04.04 21:21) [48]

Резонно. Вот только станете ли Вы давать кому-либо доступ к компоненту, один из методов которого содержит защиту значимой для Вас информации ?


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


> Адреса подменю, код в памяти скопирую
Типа в хакеры записались ;-)  Я думаю если вы захотите, то и в прайвит методе адрес подмените


 
Юрий Зотов ©   (2004-04-21 21:44) [51]

> Jack128 ©   (21.04.04 20:18) [42]

Кстати - конкретно для Вашего примера даже никаких хакерских штучек не требуется - надо просто добавить в объявление TChildTest всего одну строчку:

TChildTest = class(TTest)
protected
 procedure SetColor(const Value: TColor);
public
 property Color: TColor read FColor write SetColor;
end;

Вот и весь "взлом".

> Андрей Сенченко ©   (21.04.04 21:13) [47]

Protected - это ерунда, в потомке класса могу делать, что хочу. Хуже, когда метод статический.

А примеров - навскидку, могу привести два (хотя подобных случаев было куда больше). Оба примера реальные.

1. Свойство Application.MainForm - только для чтения. Как быть, если каждому юзеру требуется иметь свою главную форму? Точнее говоря, класс формы у всех один, а вот ресурсы - разные (хранятся отдельно от EXE и заливаются снаружи).

2. Хочу иметь TListView со своими Items и Columns. Написать наследников TListItems и TListColumns - не вопрос. Заменить стандартные Items своими - тоже не вопрос, достаточно заместить метод CreateListItems. А вот для Columns аналогичного механизма почему-то не предусмотрено.


 
Jack128 ©   (2004-04-21 22:08) [52]


> Юрий Зотов ©   (21.04.04 21:44)
А что, от такого "взлома" перенос SetColor в private спасет? ;-)


 
Юрий Зотов ©   (2004-04-21 22:46) [53]

> Jack128 ©   (21.04.04 22:08) [52]

Неа, не спасет. И вот это, IMHO, как раз и есть одна из вещей, которые оставляют желать лучшего в Delphi-модели ООП.


 
WebErr ©   (2004-04-22 18:28) [54]

Мда, единственно ценное из вышесказанного - это то, что практически все программисты боятся некоего абстрактного "юзверя". :))))


 
Игорь Шевченко ©   (2004-04-23 11:23) [55]

WebErr ©   (22.04.04 18:28)


> единственно ценное из вышесказанного


У нас разная система ценностей.

---
LMD


 
Anatoly Podgoretsky ©   (2004-04-23 11:24) [56]

WebErr ©   (22.04.04 18:28) [54]
Не все боятся, некоторые создают экземляры базового юзера


 
Goida ©   (2004-04-23 11:31) [57]


> WebErr

Ты мнишь себя гением... :-.


 
Матлабист   (2004-04-23 12:29) [58]


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


И вообще, нафиг эту модульнсть --- гибче писать все в одном файле ;)


 
Goida ©   (2004-04-23 13:06) [59]

да лучше вообще не писать, пусть другие парются...


 
Locker   (2004-04-23 13:36) [60]

Из разговора в институтской курилке:
- protected лучше, чем private!
- нет, private лучше!
- нет, protected!
- ну и чем, чем лучше?
- чем private!


 
vl_chel ©   (2004-04-23 14:03) [61]

>> Гаврила   (21.04.04 17:51) [33]
полностью согласен
>>Goida ©   (21.04.04 18:32) [38]
не буду спорить ООП учил по книге Страуструпа очень давно - тогда паскаль еще не был объектным мог запамятовать

Я имел в виду именно парадигму ООП, а не синтаксическую реализацию кода

Хочу заметить что ООП - идеология составления текстов программ, а не способа их выполнения на ЭВМ.


 
Nous Mellon ©   (2004-04-23 14:29) [62]

Чего вы взъелись то? Парень проходит кастинг на роль Дмитрия О.
Видимо скоро повится AvtoObjeсtReader какой-нибудь.


 
evvcom ©   (2004-04-23 14:35) [63]

Жестокий спор! Как бы мы не защищались от хакера - не спасет ничего, если талантливому и нефиг делать хакеру взбредет в голову поломать нашу прогу.

Даже объявление
 private
   FMainForm: TForm;
 public
   property MainForm: TForm read FMainForm;
тоже не спасает нас на 100%. Простейшая конструкция:

type
 PForm = ^TForm;
...
 PForm(@Application.MainForm)^ := MyForm;

влегкую подменяет приватную переменную.

Я бы здесь отметил, что правильное использование private, protected и т.д. является "хорошим тоном" в программировании. private предостерегает юзверя, что сюда не надо бы лезть, но коль уж тебе так неймется, то все это на твой страх и риск. Т.е. если правильно используешь мой компонент, то я отвечу за него (на вопросы и т.д.), в противном случае - пошел на фиг.

Горячая беседа получилась...


 
Anatoly Podgoretsky ©   (2004-04-23 14:45) [64]

Речь то не о защите от хакера, ломать нечего, когда есть исходники, речь про то зачем и как использовать.


 
evvcom ©   (2004-04-23 14:54) [65]


> речь про то зачем и как использовать

это изначальный вопрос, но потом его настолько развили, что речь уже пошла и про "защиту от хакера". И даже тот факт, что у меня есть исходники стандартных для Delphi классов, мне помогает лишь изучать исходный код, но исправить его я могу далеко не всегда.


 
Anatoly Podgoretsky ©   (2004-04-23 15:03) [66]

evvcom ©   (23.04.04 14:54) [65]
Скажу на это одной популярной фразой

Не трогай генофонд зараза, а то пожелеешь.


 
evvcom ©   (2004-04-23 15:19) [67]


> Не трогай генофонд зараза, а то пожелеешь.

Во первых, "исправить его я могу далеко не всегда" совсем не означает, что я его правлю. Я сам сторонник того, чтобы "генофонд" не трогать.
Во вторых, в правилах поведения на форуме есть что-то типа "обращайтесь к другим участникам форума уважительно".
И в третьих, совсем не обязательно в каждом ответе искать заковырки, за что бы можно было зацепиться.

Поэтому для меня эта тема закрыта...


 
Sha ©   (2004-04-23 16:36) [68]

Все бы хорошо, но огорчает, что в исходниках VCL видимость полей и методов иногда необоснованно заужена.


 
Kto ©   (2004-04-23 19:59) [69]

Я полагаю, что всё-таки авторы как-то это обосновали.
Да и не думаю, что они предсмотрели все варианты использования их кода. Там иногда такие перлы попадаются... :)
Н-р:
В TCustomComboBox"е

if DroppedDown then
DrawFrameControl(C.Handle, R, DFC_SCROLL, DFCS_FLAT or DFCS_SCROLLCOMBOBOX)
else
DrawFrameControl(C.Handle, R, DFC_SCROLL, DFCS_FLAT or DFCS_SCROLLCOMBOBOX);


 
WebErr ©   (2004-04-26 16:13) [70]

В общем раскрываю карты...
Весь сыр-бор я затеял из-за того, что защищать данные надо от юзера так, чтобы программер мог до них добраться - в этом случае мне совсем не нравится то, что от меня что-то где-то прячут и уж совсем необосновано "LMD" (И.Ш.M.D. (с))! Во времена Турбо Паскаля 7.0 обходились просто двумя секциями private и public - protected появилась после, дополняя всё это "хозяйство", а уж published вообще никакого отношения к ООП не имеет, так как это - фикция, придуманная Борландовцами.
Мне кажется, и это - лично моё мнение, что хватило бы и 2-х секций - одна для программеров и "имподобных" - protected - гибкая, защищённая секция, а другая - public, для тех, кто просто использует возможности "чего-то-вами-созданного".
P.S. Примеры, приведённые в этой ветке, считаю неубедительными, так как невозможно программеру доказать как и зачем ему защищать данные и методы от программера.


 
WebErr ©   (2004-04-26 16:15) [71]

В общем раскрываю карты...
Весь сыр-бор я затеял из-за того, что защищать данные надо от юзера так, чтобы программер мог до них добраться - в этом случае мне совсем не нравится то, что от меня что-то где-то прячут и уж совсем необосновано "LMD" (И.Ш.M.D. (с))! Во времена Турбо Паскаля 7.0 обходились просто двумя секциями private и public - protected появилась после, дополняя всё это "хозяйство", а уж published вообще никакого отношения к ООП не имеет, так как это - фикция, придуманная Борландовцами.
Мне кажется, и это - лично моё мнение, что хватило бы и 2-х секций - одна для программеров и "имподобных" - protected - гибкая, защищённая секция, а другая - public, для тех, кто просто использует возможности "чего-то-вами-созданного".
P.S. Примеры, приведённые в этой ветке, считаю неубедительными, так как невозможно программеру доказать как и зачем ему защищать данные и методы от программера.


 
WebErr ©   (2004-04-26 16:29) [72]

Ну вот, например:

TDynArray = class
protected
  FBytes: Word;
  FCount: Longword;
  FSize: Longword;
  FBuffer: Pointer;
  procedure ResetParams; virtual;
  function GetPElem(AIndex: Longword): Pointer;
public
  constructor Create(ABytes: Word); virtual;
  function SetCount(ACount: Longword): Boolean; virtual;
  property Bytes: Word read FBytes;
  property Count: Longword read FCount;
  property Size: Longword read FSize;
  property Buffer: Pointer read FBuffer;
  property PElem[AIndex: Longword]: Pointer read GetPElem; default;
end;

Скажите, что я должен занести в private, а я потом скажу, где Вы все ошиблись! :))))
(Заодно тест на ООП для самых "одарённых"!)


 
WebErr ©   (2004-04-26 16:37) [73]


> evvcom ©   (23.04.04 14:35) [63]
> Я бы здесь отметил, что правильное использование private,
> protected и т.д. является "хорошим тоном" в программировании.
> private предостерегает юзверя, что сюда не надо бы лезть,
> но коль уж тебе так неймется, то все это на твой страх и
> риск. Т.е. если правильно используешь мой компонент, то
> я отвечу за него (на вопросы и т.д.), в противном случае
> - пошел на фиг.

Чем protected хуже? :))))


 
panov ©   (2004-04-26 16:37) [74]

Из серии "Иди туда, не знаю куда, принеси то, не знаю что..."

------------------
Не говорите мне, что я должен делать, и Вы не узнаете, куда Вам следует направить свои стопы...


 
WebErr ©   (2004-04-26 16:41) [75]


> panov ©   (26.04.04 16:37) [74]

Из серии "... ну и пусть себе плывёт - нам не нужен пенопласт ..." - не в тему! :))))


 
Digitman ©   (2004-04-26 16:41) [76]


> WebErr ©   (26.04.04 16:29) [72]


слушай-ка , "одаренный", ты упрям как мул !

"юзеру" передаются DCU и BPL
"программеру" передаются кр.того исходники

если ты счел себя "одаренным", возьми перенеси из private в protected то что тебе не нравится, керекомпилируй модуль и курочь его на здоровье ! Только потом не жалуйся в службу поддержки поставщика пользуемого тобой класса, что его класс нихрена не работает !!


 
WebErr ©   (2004-04-26 16:45) [77]

Первый пошёл! :))))


 
panov ©   (2004-04-26 16:50) [78]

Код этот весь неправильный.
Вместо этого -
TDynArray = class
protected
 FBytes: Word;
 FCount: Longword;
 FSize: Longword;
 FBuffer: Pointer;
 procedure ResetParams; virtual;
 function GetPElem(AIndex: Longword): Pointer;
public
 constructor Create(ABytes: Word); virtual;
 function SetCount(ACount: Longword): Boolean; virtual;
 property Bytes: Word read FBytes;
 property Count: Longword read FCount;
 property Size: Longword read FSize;
 property Buffer: Pointer read FBuffer;
 property PElem[AIndex: Longword]: Pointer read GetPElem; default;
end;


- пишем

var
 DynArray: array of <а здесь на любителя>;

PS.

В следующий раз не надо копировать пустой код из исходников компонент.


 
WebErr ©   (2004-04-26 16:55) [79]

Это мой собственный код! :))))
Могу объяснить каждую запятушку, правда восстановлен он по памяти, поэтому наверное не компилится!
Фишка в том, что вместо <а здесь на любителя>, нужно что-то ставить.
В Паскале отсутствует столь нужный мне template <class T>
Полный код не привожу, т.к. вы сразу догадаетесь, на чём я Вас хочу поймать...
Удачи! :))))


 
Locker   (2004-04-26 16:58) [80]

WebErr ©   (26.04.04 16:29) [72]

Особо хорош момент:
 ...
 function SetCount(ACount: Longword): Boolean; virtual;
 ...
 property Count: Longword read FCount;
 ...



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

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

Наверх




Память: 0.63 MB
Время: 0.035 c
3-1082983559
Sirruf
2004-04-26 16:45
2004.05.23
Кэшированные изменения в Interbase Express


1-1083844743
Talle
2004-05-06 15:59
2004.05.23
Компоненты TXMLDocument и TWebBrowser


14-1083697893
vic_vm
2004-05-04 23:11
2004.05.23
Реально ли вытащить из COM объекта его методы?


6-1081331309
NorthMan
2004-04-07 13:48
2004.05.23
Народ, в сети гуляет пример реализации PING а в Delphi


11-1071470678
BaDeVlad
2003-12-15 09:44
2004.05.23
Что за глюк с иконками в меню?





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