инкапсуляция и указатели на объекты - PullRequest
0 голосов
/ 20 января 2012
class CommandSchedule
    {
    private : 
       List<SubSchedule*> mSubScheduleList;
    public  :  
       void addSubSchedule (int id) 
       {  
          mSubScheduleList.add(new SubSchedule(id));
       }
       SubSchedule* addSubSchedule (int id) 
       {
          SubSchedule* item = new SubSchedule(id);

          mSubScheduleList.add(item);

          return item;
       }
    };

В этом классе я определяю 2 функции addSubSchedule, одну возвращающую void, одну возвращающую указатель на объект.

Итак, мой вопрос в том, что если функция, которая возвращает указатель на объектнарушает инкапсуляцию класса CommandSchedule?Я чувствую себя неловко из-за проблем с инкапсуляцией, поэтому любая помощь очень ценится.

1 Ответ

3 голосов
/ 20 января 2012

Почему это нарушает инкапсуляцию? Внутреннее представление ваших объектов все еще скрыто:

private : 
   List<SubSchedule*> mSubScheduleList;

Если SubSchedule также не считается внутренним представлением , здесь нет проблем.

В хорошо инкапсулированном классе только его функции-члены могут манипулировать его внутренними деталями. В этом случае тот факт, что используется List, кажется подробным, потому что все, что беспокоит пользователя открытого интерфейса, - это то, что класс позволяет ему добавлять подпрограммы. Как хранятся эти подпрограммы, является внутренней деталью. Позже вы можете изменить эту деталь (скажем, вместо этого, сохранив их в SortedList), не затрагивая пользователей общедоступного интерфейса. Таким образом, создание переменной List<...> private способствует хорошей инкапсуляции.

Если пользователь интерфейса ожидает, что сможет манипулировать SubSchedule объектами напрямую, тогда нет проблем с раскрытием этого. Но если нет причин делать это, то использование SubSchedule s, вероятно, также является внутренней деталью, и поэтому не должно отображаться в общедоступном интерфейсе.

...