Проект наследования C ++: избегайте дублирования членов - PullRequest
0 голосов
/ 27 апреля 2018

Предположим, что у каждого есть два C++ класса, которые поддерживают операции только для чтения и только для записи в файловом дескрипторе соответственно.

class ReadFd {
 public:
  ssize_t read( /* */ ) {
    // read from file_descriptor_
  }
 protected:
  int file_descriptor_;
};

class WriteFd {
 public:
  ssize_t write(/* */) {
    // write to file_descriptor_
  }
 protected:
  int file_descriptor_;
};

Теперь предположим, что нужно определить класс ReadWriteFd, который поддерживает операции чтения и записи.

У меня вопрос, как спроектировать такой класс чтения-записи, чтобы избежать дублирования кода?

Я не могу наследовать от ReadFd и WriteFd, потому что, очевидно, мне нужен только один file_descriptor_. Реальная ситуация, с которой я столкнулся, немного сложнее, но концепция здесь отражает ее довольно близко.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Создайте новый базовый класс с именем class Fd, который содержит дескриптор файла. class ReadFd & WriteFd могут оба наследовать его с отношением is-a. Ваш ReadWriteFd может наследовать от этих 2 классов. Просто помните, что вам придется решить проблему множественного наследования diamond .

Вот пример UML:

enter image description here

0 голосов
/ 27 апреля 2018

Как Принципы ОО Состояние:

Инкапсулируйте то, что меняется. - можно перефразировать как «Определите аспекты вашего приложения, которые отличаются, и отделите их от того, что остается неизменным». Для тех аспектов, которые не меняются, мы оставляем их такими, какие они есть. Конечно, мы не можем просто выбросить те части, которые различаются; первый все еще должен взаимодействовать с ними, чтобы система работала.
В вашем конкретном случае вы можете создать базовый класс с общими данными и интерфейсами.

0 голосов
/ 27 апреля 2018

Добавьте третий класс, основанный как на ReadFd, так и на WriteFd, единственная цель которого - содержать переменную дескриптора (и, возможно, другие вещи, общие как для чтения, так и для записи).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...