请不要介意语法。我想把这篇文章写得尽可能简短。
我们有一个如下的类层次结构。
// 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来表示它们。
问题是,每个类都有很多特定于每个事件的方法。例如:
getRec(); // has specific implementations for each event. 假设有一些类似于process方法的东西。
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具有相同的实现时,泰勒的建议才有效。对吗?但在这种情况下,情况并非如此。至少对于某些方法来说不是这样。
发布于 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类,因此如果您像这样定义事件类,则每个事件实际上只需要一个类,而不是每个产品类型的每个事件一个类:
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();
}发布于 2010-07-24 01:23:32
看一看Strategy Pattern。为每个事件创建一个策略类,并在运行时将其注入到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()。
https://stackoverflow.com/questions/3320595
复制相似问题