множественное наследование удобно? - PullRequest
0 голосов
/ 17 февраля 2012

Я хочу реализовать класс Algorithm, который использует некоторые служебные классы. но одному классу может потребоваться переменная-член или функция другого вспомогательного класса. Так что вместо
состав лучше использовать наследование, как показано ниже?

class A{
 public:

 void setA(int var){ a = var;}

 int a;

};

class B{
public:
  void foo(int var){ 
      if (var==1){ 
           //bla bla...
      }else{
           //bik bik...
      }
};


class Algo : public A , public B{

public :

  void run(){

    setA(1);
    foo(a);
  }

};

Ответы [ 5 ]

1 голос
/ 17 февраля 2012

Ваш класс Algo должен наследовать от A и B, только если это истинное IS-A отношение к A и B. Если вы просто хотите использовать функциональность от A или B, рассмотрите вместо этого композицию (или на минимум частное наследование).

Например, если я хочу создать класс, и этот класс должен сделать некоторые записи, то мой регистратор класса HAS-A, но это не такДело в том, что это IS-A регистратор.Поэтому я не хотел бы наследовать от логгера, но вместо этого использовал бы композицию.

0 голосов
/ 17 февраля 2012

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

0 голосов
/ 17 февраля 2012

Мне нравится эта концепция наследования:

Обычно считается способом «повторного использования существующего кода» путем создания нового класса, который наследуется от другого существующего класса. Таким образом, вы можете расширить функциональность существующего класса без касания кода существующего класса. Но у Херба Саттера есть несколько иной подход к использованию наследования: «Унаследовать, не использовать повторно, но использовать повторно. Не наследовать публично для повторного использования кода (который существует в базовом классе); наследовать публично для того, чтобы для повторного использования (существующим кодом, который уже полиморфно использует базовые объекты). " [C ++ Стандарты кодирования, с. 64]. Он также говорит: «В правильном наследовании производный класс моделирует особый случай более общей базовой концепции». [Там же, с. 66]

http://cpp.strombergers.com/

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

0 голосов
/ 17 февраля 2012

Наследование предназначено для выражения отношений "является" и должно соответствовать принципу подстановки Лискова.Можете ли вы сказать, что Алго А и Алго Б?В общем, я считаю плохой идеей для производного класса смешивать закрытые переменные базовых классов (вы можете установить их как защищенные, но они, вероятно, должны быть закрытыми)Вы всегда можете написать геттеры и сеттеры.Вы можете столкнуться с проблемами множественного наследования разными способами, и я думаю, что ваш подход, хотя и удобный сейчас, приведет к тому, что вы будете программировать менее удобным способом.Я стараюсь зарезервировать наследование для случаев, когда мне нужно полиморфно относиться к классам, в большинстве других случаев я предпочитаю композицию.

0 голосов
/ 17 февраля 2012

В вашем случае не имеет смысла использовать наследование, потому что Algo не является A или B, оно просто использует их.

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