Вопрос о возможном дизайне шаблона - PullRequest
1 голос
/ 09 июня 2010

У меня в голове такой дизайн .... Моя цель - повторно использовать программу с некоторыми функциями и без некоторых функций.Как это называется в литературе?Дополнительная информация: есть события. События вызывают вызовы функций function1 () или function2 () ...

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

Таким образом, похоже, что это может быть шаблон наблюдателя + отношение hasa ...

class feature1
{
void feature1functionx();
void feature1functiony();
}

class feature2
{
void feature2functionw();
void feature2functionz();

}

class program: feature1, feature2
{
 vector<string> data;
void function1()
{
 feature2functionw();
}
void function2()
{
 feature1functiony();
 feature2functionz();
}
void execute()
{
  function1();
  function2();
}

}

Ответы [ 4 ]

7 голосов
/ 09 июня 2010

Наследование моделирует отношение IS-A.

Здесь было бы естественным использовать отношение HAS-A, если вы хотите повторно использовать функции: это композиция.* Я знаю, что частное наследование иногда рассматривается как кратчайший путь, но здесь оно ничего не дает, поэтому предпочитайте композицию, так как она вас не слишком связывает.1011 *: добавлено определение методов, поскольку это, очевидно, было не так ясно.

0 голосов
/ 09 июня 2010

Это звучит почти как интерфейсный класс, но похоже, что вы реализуете много кода в этих базовых классах, а не имеете их чисто абстрактные, что является распространенным способом создания интерфейсов в C ++.Я полагаю, это может сработать, если вы уверены, что базовые классы никогда не будут совместно использовать какие-либо имена и т. Д. Я не знаю, можно ли их также описать как смешанные классы, как описано в этом вопросе: Использование для множественного наследования?

0 голосов
/ 09 июня 2010

Код, который вы опубликовали, напоминает мне так называемый шаблонный метод.Теоретически этот шаблон выглядит следующим образом:

class Base
{
public:
    void execute()
    {
        function1();
        function2();
    }
private:
    virtual void function1();
    virtual void function2();
};

, а затем в каком-то классе:

class Derived1 : public Base
{
    void function1()
    {
        //implementation here...
    }
};

, а затем вы звоните

b->execute(); //b is of type Base* and points to an object of type Derived1

ивсе сделано.

Не уверен, как это будет работать в вашем случае, возможно, не совсем, но по крайней мере это пример шаблона, очень похожего на то, что вы описываете.

0 голосов
/ 09 июня 2010

Эта идея кажется мне странной и сложной. Вот для чего нужны уточнения и замены в иерархии классов.

В частности, я бы искал что-то вроде этого:

class feature1
{
  virtual void function1();
  virtual void function2();
  void execute() {
    function1();
    function2();
  }

}

class feature2:public feature1 //this is your program class
{
  virtual void function1() 
  {
     feature1::function1() //call previous functionality to refine
     //do feature2 stuff here
  }

  virtual void function2()
  {
     //don't call base class to replace
     //do feature2 stuff here
  }
}

Теперь feature2.Execute () делает то, что вы хотите.

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