Public, Private, Protected - что и когда?
|
|
Morfay | Дата: Пятница, 27 Января 2012, 15:30 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Здравствуйте. При написании движка столкнулся с такой ситуацией, что не знаю, как распределить доступ к функциям и переменным. Я знаю различия между privat, public и protected, но в каких случаях лучше использовать protected или private не могу понять - в мануалах сказано, чтобы защитить данные или предотвратить ненужный вызов функции. Но в С++ до сих пор с подобным не сталкивался (или думаю, что не сталкивался). Объясните, пожалуйста, на примерах (желательно связанных с разработкой игр), когда нужно отнести переменные\функции в private или protected.
|
|
| |
Rorschach | Дата: Пятница, 27 Января 2012, 16:39 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Если есть класс который наследует от класса о котором идет речь и использует как-то эти функции, нужно сделать их защищенными, иначе приват.
Never compromise. Not even in the face of Armageddon.
|
|
| |
Morfay | Дата: Пятница, 27 Января 2012, 18:31 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| Это не то, я понимаю как работает private и protected. Мне нужны конкретные примеры. Могу прикинуть только, то защита нужна для каких-либо констант класса, либо специальных переменных, которые изменяются при определенных условия в определенной функции (чтобы напрямую их изменить нельзя было). А что еще? Можно, пожалуйста конкретные примеры (допустим ваши), когда вы защищали переменные или функции?
|
|
| |
noTformaT | Дата: Пятница, 27 Января 2012, 18:36 | Сообщение # 4 |
Ukrainian independent game developer
Сейчас нет на сайте
| Исходники одного движка, не с++, но все-же.
@noTformaT
|
|
| |
Rorschach | Дата: Пятница, 27 Января 2012, 18:41 | Сообщение # 5 |
участник
Сейчас нет на сайте
| Любой пример будет слишком исскуственным. Любые данные или методы, которые не используются за пределами данного класса следует сделать приватными. Если данные или методы используются в дочерних классах, их делают защищенными. Никаких других скрытых мотивов выбора между private и protected не существует.
Never compromise. Not even in the face of Armageddon.
|
|
| |
Morfay | Дата: Пятница, 27 Января 2012, 19:33 | Сообщение # 6 |
почетный гость
Сейчас нет на сайте
| Немного не понятно. Насколько я знаю, приватные переменные можно поменять только через метод класса, приватные методы нельзя вызвать напрямую (на то они и приватные). А протектед, можно использовать в дочерних классах, а в остальных случаях изменить нельзя. То есть, если методы/переменные используются только внутри класса, то их делаем приватными. Если класс родительский, но методы и переменные используются только внутри классов (родительского и дочернего), то протектед. А если используем методы/переменные внутри main или других классах то паблик. Я правильно понял?
|
|
| |
Demeron | Дата: Пятница, 27 Января 2012, 19:40 | Сообщение # 7 |
User created in C++
Сейчас нет на сайте
| public - можно использовать вне класса. можно использовать при наследовании. private - нельзя использовать вне класса. нельзя обращаться при наследовании. protected - нельзя использовать вне класса. можно использовать при наследовании.
|
|
| |
Rorschach | Дата: Пятница, 27 Января 2012, 20:14 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Да.Добавлено (27.01.2012, 20:14) ---------------------------------------------
Да.
Never compromise. Not even in the face of Armageddon.
|
|
| |
Matou | Дата: Пятница, 27 Января 2012, 20:32 | Сообщение # 9 |
Исходный коТ
Сейчас нет на сайте
| Morfay, ниразу не видел каких-то рекомендаций и примеров когда надо использовать public когда private и когда protected. Видимо потому что это элементарные вещи понятные на интуитивном уровне. Почитав твои посты сложилось впечатление что ты не понимаешь зачем вообще нужно скрывать некоторые переменные и методы класса, посему советую изучить такой вопрос как инкапсуляция.
|
|
| |
Morfay | Дата: Пятница, 27 Января 2012, 21:33 | Сообщение # 10 |
почетный гость
Сейчас нет на сайте
| Вроде понял, всем спасибо. Про инкапсуляцию перечитаю еще раз, может чего не заметил. Честно говоря, вопрос возник после того, когда заметил, что у меня в классах все в public, и это мне никак не мешало. Вот и захотелось просветить себя в каких случаях лучше будт защитить методы и переменные.
Тему можно закрывать. Еще раз всем спасибо.
|
|
| |
Coment | Дата: Суббота, 28 Января 2012, 19:05 | Сообщение # 11 |
почетный гость
Сейчас нет на сайте
| Пожалуй добавлю немного слов
У нас есть пуль от телевизора - пользователь может переключать каналы, менять уровень громкости итд. Но вот как меняется громкость ему знать не обязательно. Я к чему. Абстракция одна из составляющих ООП. Для начала создайте абстрактную модель вашей идеи и тогда сами поймете что скрывать,а что нет
|
|
| |
ExoloN32 | Дата: Пятница, 17 Февраля 2012, 22:51 | Сообщение # 12 |
был не раз
Сейчас нет на сайте
| Я скажу проще. Рассматривай класс в первую очередь как тип данных, которые как правило либо privat, либо protected. А Функции это приложение к данным. Они обычно public. Примерно от сюда и пляши. Тем более, что функции хранятся в стеке, а экземпляр класса состоит только из данных.
Добавлено (17.02.2012, 22:51) --------------------------------------------- Доступ к данным осуществляется через функции. Например... void SetData(int Value); int GetData();
Сообщение отредактировал ExoloN32 - Пятница, 17 Февраля 2012, 22:53 |
|
| |
Stage | Дата: Суббота, 18 Февраля 2012, 00:52 | Сообщение # 13 |
постоянный участник
Сейчас нет на сайте
| Quote Рассматривай класс в первую очередь как тип данных, которые как правило либо privat, либо protected. А Функции это приложение к данным. Они обычно public. Примерно от сюда и пляши. Самое отвратительное объяснение инкапсуляции ever.
|
|
| |
ExoloN32 | Дата: Суббота, 18 Февраля 2012, 22:58 | Сообщение # 14 |
был не раз
Сейчас нет на сайте
| Думаю, что для новичка в самый раз. Можно объяснять долго и нудно, но всё это он уже где-то читал. Добавлено (18.02.2012, 22:58) --------------------------------------------- protected делаешь тогда, когда нужно, чтобы был доступ к этим данным в классе наследнике. Иначе privat.
|
|
| |