首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类层次结构

类层次结构
EN

Stack Overflow用户
提问于 2010-07-24 01:05:46
回答 2查看 298关注 0票数 3

请不要介意语法。我想把这篇文章写得尽可能简短。

我们有一个如下的类层次结构。

代码语言:javascript
复制
// abstract class.   
class BaseProd   
// concrete classes.   
class Prod1 : public BaseProd   
class Prod2 : public BaseProd   
class Prod3 : public BaseProd   

每个类都有3个子类,如Prod1New、Prod1Cancel和Prod1Modify,其他2个类也是如此。现在,因为New、Cancel和Modify是事件,所以我们可以使用enum来表示它们。

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

代码语言:javascript
复制
getRec(); // has specific implementations for each event.   

假设有一些类似于process方法的东西。

代码语言:javascript
复制
void Prod1::process()
{
   getRec(); // Each derived class overrides the method.   
   getPayment();// Each derived class overrides the method.   
}  

这样,我们有13个类,每个类对应3个产品,每个产品有3个事件。

如果我们有2个以上的产品,这些类将增加8个。

我们可以有任何替代的方法来实现这个层次结构吗?

更新:只有当prod1的NewEvent和prod2的NewEvent具有相同的实现时,泰勒的建议才有效。对吗?但在这种情况下,情况并非如此。至少对于某些方法来说不是这样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-24 01:13:01

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

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

由于您的所有产品都继承自BaseProd类,因此如果您像这样定义事件类,则每个事件实际上只需要一个类,而不是每个产品类型的每个事件一个类:

代码语言:javascript
复制
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事件,并对其调用适当的方法:

代码语言:javascript
复制
void Prod1::process()
{
  NewProductEvent event(this);

  event.getRec();
  event.getPayment();
}
票数 3
EN

Stack Overflow用户

发布于 2010-07-24 01:23:32

看一看Strategy Pattern。为每个事件创建一个策略类,并在运行时将其注入到Prod类中。

代码语言:javascript
复制
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()。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3320595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档