Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
#1

protected или не protected : ) - C++

24.06.2011, 13:51. Просмотров 1038. Ответов 14
Метки нет (Все метки)

собстно не могу решить как поступить.

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

есть 3 варианта организации/реализации иерархии классов(на примере хранения размера окошка).

1) методы чисто виртуальные. каждый класс их реализовывает сам.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class IWindow 
{
public:
  virtual void setSize() = 0;
};
 
class SomeWindow : public IWindow 
{
public:
  virtual void setSize(int _size) { size = _size; };
 
private:
  int size;
};
2) методы виртуальные с базовой реализацией. методы юзают протектед поля.

C++
1
2
3
4
5
6
7
8
class IWindow 
{
public:
  virtual void setSize(int _size) { size = _size; };
 
protected:
  int size;
};
3) поля приватные. методы "обычные"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class IWindow 
{
public:
   void setSize(int _size) { size = _size; };
   int  getSize() { return size; }
private:
  int size;
};
 
class SomeWindow : public IWindow 
{
 
};
3 вариант мне кажется будет самый правильный. но все же чет я сомневаюсь во всем этом % )
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2011, 13:51     protected или не protected : )
Посмотрите здесь:

PROTECTED - C++
есть два класса: class Base{ private: int age; }; class Derived: public Base{ .......

Protected DVD - C++
Доброго дня! Не нашел нужного раздела для подобной темы... Суть в чем - как можно определить, является ли DVD диск защищенным от...

Protected Struct - C++
Привет народ. Сижу тут с классами корочь, и вдруг вылезла ошибка (типа нет доступа), но никак не могу понять почему: ошибка в 33-й строке,...

Protected в классах - C++
#include <iostream> using namespace std; class TPoint{ protected: int x,y; TPoint *t; ...

Ключ доступа protected - C++
В каких случаях рекомендовано использовать этот ключ доступа? Если можно, то приведите примеры.:help:

Обращение к члену protected - C++
Добрый день, помогите разобраться Обращение к члену protected, сообщается ошибкой Код класса: #include <iostream> #include <string>...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
681 / 583 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.06.2011, 13:55     protected или не protected : ) #2
а в чем вопрос то?

у тебя тут даже никакого наследования нет. И чтобы оно было надо хотя бы в абстрактном классе чисто виртуальную функцию сделать с параметром тоже.
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
24.06.2011, 14:05  [ТС]     protected или не protected : ) #3
ок.. вот синтаксически верный вариант, думал, что и так понятно будет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// так
class IWindow 
{
public:
   void setSize(int _size) { size = _size; };
   int  getSize() { return size; }
private:
  int size;
};
 
class SomeWindow : public IWindow
{
 
};
 
// или так
class IWindow 
{
public:
   virtual void setSize(int _size) = 0;
   virtual int  getSize() = 0;
};
 
class SomeWindow : public IWindow
{
public:
   void setSize(int _size) { size = _size; };
   int  getSize() { return size; }
private:
  int size;
};
 
 
// или так
class IWindow 
{
public:
    virtual void setSize(int _size) { size = _size; };
    virtual int  getSize() { return size; };
protected:
    int size;
};
 
class SomeWindow : public IWindow
{
 
};
в данном случае первый вариант мне кажется наиболее оптимальным. но все же есть кое какие сомнения % )

и да.. вопрос: как лучше сделать
sandye51
программист С++
681 / 583 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.06.2011, 14:17     protected или не protected : ) #4
ну это в зависимости от того, что тебе нужно. Если в произвольном классе необходима переменная size, то лучше 3ий вариант (конечно можно воспользоваться будет методами - аксессорами, но это не прикольно). Я бы лучше на нем остановился.
второй вариант - такие тревиальные операции определять в наследованном классе - бессмысленно)
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
24.06.2011, 14:25  [ТС]     protected или не protected : ) #5
можешь пояснить почему аксессоры не прикольно ?
sandye51
программист С++
681 / 583 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.06.2011, 14:36     protected или не protected : ) #6
в случае protected тебе не придется лишний раз вызывать аксессоры - можно напрямую обратиться к полю.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
24.06.2011, 16:44     protected или не protected : ) #7
Есть мнение, что protected для наследования так же не надо использовать, как public для полей вообще. Это противоречит принципу сокрытия данных, пусть мы даже работаем с родственными сущностями. Я этого мнения придерживаюсь и при необходимости пользуюсь сеттерами/геттерами.
sandye51
программист С++
681 / 583 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
24.06.2011, 17:23     protected или не protected : ) #8

Не по теме:

silent_1991, как скажешь, шеф


получается тогда public наследование еще хуже? Оо остается только private
итого, доступны только методы
silent_1991
24.06.2011, 17:25
  #9

Не по теме:

sandye51, я ж никому ничего не навязываю)) Ты высказал своё мнение, я своё))

kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
24.06.2011, 18:04     protected или не protected : ) #10
Я бы на данном этапе следовал правилу: если поле нужно в производных классах и не нужно в других функциях, оно должно быть protected. Третий вариант вроде как.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
25.06.2011, 07:22     protected или не protected : ) #11
Есть святое правило: По умолчанию всё "константное приват". А уже потом, при необходимости, убираешь конст, делаешь защищённым или открытым.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class IWindow 
{
public:
   void setSize(int _size) { size = _size; };
   int  getSize() { return size; }
private:
  int size;
};
 
class SomeWindow : public IWindow
{
 
};
Вариант ошибочен. Т.к. название IWindow подразумевает, что это интерфейс, т.е. чисто виртуальный класс. Если название поменять, то вполне может иметь место быть.

Добавлено через 49 секунд

Не по теме:

Ну что, начнём холивар про методы-аксессоры?

alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
25.06.2011, 09:16     protected или не protected : ) #12
метод setSize - это конечно тот метод, который нужно реализовывать во всех наследниках. Ведь он там серьезно отличается
Evg
Эксперт CАвтор FAQ
17469 / 5707 / 362
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
25.06.2011, 09:58     protected или не protected : ) #13
Из меня плохой советчик по подходам в Си++, потому как пока имею Си'шное мышление, но всё-таки свои соображения скажу. Size с позиции данных - это некая базовая вещь, которая независимо от того, как реализован производный класс, будет иметь один и тот же смысл. Поэтому поле size должно быть данными базового класса и устанавливаться только через методы базового класса. В том плане, что оно должно быть private. К тому же технически у тебя в программе будет только одна точка, которая обращается к этому полю, а в общем случае при программировании всегда желательно иметь минимальное количество процедур/методов, которые обращаются непосредственно к глобальным данным.

Что касается методов SetSize, GetSize, то в зависимости от реализации они могут меняться. Не по интерфейсу, но по внутреннему наполнению. Типа того, что при запуске SetSize помимо установки размера могут понадобиться какие-то дополнительные действия. При этом чтобы этот размер в конечном итоге установить, производному классу, даже после переопределения метода, придётся вызвать метод базового класса, что сократит некоторое количество вероятных ошибок по сравнению с случаем, когда у тебя поле size имеет доступ private

Исходя из этого мне кажется, что поле size должно быть private, а методы SetSize, GetSize - виртуальными. При этом при переопределении методов в производном классе выставляется требование, что необходимо вызывать данные методы базового класса. В итоге ты имеешь гибкость (производный класс как хочет, так и делает), но при этом сохраняется жёсткость (всё разнообразие в конечном счёте проходит через одну точку, где можно всех контролировать)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class IWindow 
{
public:
   virtual void setSize(int _size) { size = _size; };
   virtual int getSize() { return size; }
private:
  int size;
};
 
class SomeWindow : public IWindow 
{
public:
   virtual void setSize(int _size)
   {
      // Собственные действия
      ....
      IWindow::setSize(_size);
   };
};
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
26.06.2011, 15:00     protected или не protected : ) #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Evg, если при установке размера потребуется выполнять дополнительные действия, то лучше использовать паттерн Шаблонный метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class WindowBase {
public:
   void setSize(int size) {
     onSetSize(size);
     size_ = size; 
   }
 
   int getSize() {
     return size_; 
   }
 
private: // именно private
  virtual void onSetSize(int size) {
  }
 
private:
  int size_;
};
 
class SomeWindow : public WindowBase
{
private:
  void onSetSize(int size) {
     // ...
  }
};
Во-первых, использование данного шаблона ограничивает свободу производных классов. Во-вторых, дополнительная обработка установки размера и собственно его установка четко разнесены. В-третьих, вызов метода базового класса из метода производного очень легко забыть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2011, 18:26     protected или не protected : )
Еще ссылки по теме:

Доступ внука к Protected - C++
Здравствуйте, сегодня встал перед такой проблемой. Дело в том, что создал класс, наследующий public доступом по цепочке (внук). Но если...

protected и его назначение - C++
Не понятно назначение ключевого слова протектед, хотя пишут что он нужен для класса-потомка, только зачем? Вот код, растолкуйте на нём ,что...

Protected Private Public - C++
Возник вопрос, немного наверное бредовый и на практике наврятли применимый, но всё же интересно, а возможно поменять модификатор доступа в...

c++ доступ к protected свойствам - C++
давайте рассмотрим доступ к protected свойствам и методам класса известно что напрямую их вызвать можно только внутри класса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17469 / 5707 / 362
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
26.06.2011, 18:26     protected или не protected : ) #15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Evg, если при установке размера потребуется выполнять дополнительные действия, то лучше использовать паттерн Шаблонный метод
Это в том случае, когда порядок навязывается "сверху вниз". Т.е. в твоём случае сначала вызывается onSetSize, и только потом делается установка размера. А производный класс может захотеть сначала что-то сделать, потом вызвать setSize, предполагая, к примеру, что внутри setSize пройдёт некий контроль на выход за границу экрана и подрезание значения допустимой величиной, а потом выполнятся ещё какие-то действия, который вызовут getSize (который вернёт уже подрезанное значение).

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
В-третьих, вызов метода базового класса из метода производного очень легко забыть
Идеальных решений не бывает, почти всегда приходится чем-то жертвовать.

В случае setSize в отношении окна я бы выбрал именно твой подход. Но в общем случае не надо ни одну из рекомендаций воспринимать как готовое решение на все случаи жизни. Всегда нужно выбирать способ, который наиболее оправдан в конкретном данном случае
Yandex
Объявления
26.06.2011, 18:26     protected или не protected : )
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru