C++ 类层次结构

C++ 类层次结构,c++,C++,请不要介意语法。我想把这篇文章尽量简短 我们有如下的类层次结构 // abstract class. class BaseProd // concrete classes. class Prod1 : public BaseProd class Prod2 : public BaseProd class Prod3 : public BaseProd 每个类都有3个子类,如Prod1New、Prod1Cancel和Prod1修改其他2个类的相同案例。现在,由

请不要介意语法。我想把这篇文章尽量简短

我们有如下的类层次结构

// abstract class.   
class BaseProd   
// concrete classes.   
class Prod1 : public BaseProd   
class Prod2 : public BaseProd   
class Prod3 : public BaseProd   
每个类都有3个子类,如Prod1New、Prod1Cancel和Prod1修改其他2个类的相同案例。现在,由于New、Cancel和Modify是事件,我们可以使用enum表示它们

问题是,每个类都有很多特定于每个事件的方法。例如

getRec(); // has specific implementations for each event.   
假设有一种类似过程方法的东西

void Prod1::process()
{
   getRec(); // Each derived class overrides the method.   
   getPayment();// Each derived class overrides the method.   
}  
这样,我们为3个产品提供了13个类,每个类有3个事件。
如果我们有两个以上的产品,类将增长8

我们可以有其他方法来处理这个层次结构吗

更新: 泰勒的建议只有在
Prod1的NewEvent和Prod2的NewEvent具有相同的实现。对吗?但在这种情况下,情况并非如此。至少有些方法不是这样。

我不明白为什么New、Cancel和Modify消息应该是它们所应用的产品的子类。这不满足应该定义继承的“is-a”关系。如果类
D
继承自类
B
,则“每个
D
都是
B
”的语句应该是有意义的,并且总是正确的。“一个
Prod1
是一个
BaseProd
”(即“每个特定的产品都是一个产品”)——这是正确的,也是有意义的

但是在事件的情况下,
Prod1Cancel
不是a
Prod1
。说“每个product1取消事件都是product1”没有意义。相反,
Prod1Cancel
是与
Prod1
相关的事件,因此
Prod1Cancel
类应该包含
Prod1
对象,而不是从它继承

由于您的所有产品都继承自一个
BaseProd
类,因此如果您这样定义事件类,您应该只需要为每个事件使用一个类,而不是为每个产品类型使用每个事件使用一个类:

class NewProductEvent {

   public:

     explicit NewProductEvent(BaseProd* product)
       : m_product(product)
     { /* ... */ }

     void getRec() { /* ... */ }
     void getPayment() { /* ... */ }

   private:

     BaseProd* m_product; // Use this to access the data that the event 
                          // needs from the product
};
然后,在
Prod1::process()
方法中,可以为当前对象生成
NewProductEvent
事件,并对其调用适当的方法:

void Prod1::process()
{
  NewProductEvent event(this);

  event.getRec();
  event.getPayment();
}
请看下面的图片。为每个事件创建一个strategy类,并在运行时将其注入Prod类

class BaseProd
{
   public BaseProd(EventStrategy event) : _event(event);
   private EventStrategy _event;

   virtual public void Process();
}

void Prod1::process()
{
  _event.getRec(); // Each derived class overrides the method.   
  _event.getPayment();// Each derived class overrides the method.      
}   

现在,您可以将EventStrategy子类化,并覆盖getRec()、getPayment()等,当然还可以覆盖process()。

是。。。。你肯定应该采取不同的方法。为什么每个产品都需要不同的类?它们是否有显著的不同(具有不同的属性/方法),还是只有不同的值(如名称和价格)?为什么每个产品都需要“修改”和“新建”类?您不能在类中创建这些东西方法吗?当Prod1的NewEvent和Prod2的NewEvent具有相同的实现时,这种方法可以工作。对吗?但在这种情况下,情况并非如此。至少有些方法不是。然后,您可以将不同产品的功能放入
BaseProd
中的虚拟方法中,这些虚拟方法由各个产品类重写和实现,并从事件类调用这些方法。e、 g.如果每个产品都有不同的价格计算方法,那么您可以在
ProdBase
中使用虚拟的
getPrice()
方法,然后事件类可以调用
m\u product->getPrice()
来使用特定于产品的实现。+1个好建议!这看起来与我的答案相反,为每个产品事件创建一个类,然后为所有产品只创建一个类。如果OP的程序以管理和处理事件为导向,这将是最好的主意,而如果程序以管理和处理产品为导向,则我的想法更有意义。从这个问题上看,不清楚哪一个是正确的。@Tyler:它是以管理和加工产品为导向的。这就是我选择你的原因。