如何从通用代理设计专用代理类。

时间:2016-03-07 11:37:41

标签: c++ inheritance design-patterns

考虑以下代理模式的情况。 (不确定这真的是一个“代理模式”,但我会继续使用它。)

我获得了一个类Dog和一个代理类DogProxy,它修改/扩展了Dog的功能,并且是Dog本身

class DogProxy : public Dog

代理类有一个公共方法

void DogProxy::setSource(Dog *)

被称为将代理“插入”特定的Dog对象。

DogProxy已经准备就绪,我也可以使用另一个(非代理)子类

class GermanShepard : public Dog. 

我需要实现一个新的代理类,它专门用于和GermanShepard一起使用。

此类GermanShepardProxy应该

void GermanShepardProxy::setSource(GermanShepard *)

而不是通用setSource(Dog *),虽然这不是约束,但在我看来它才有意义。

我希望GermanShepardProxyDogProxy的形式实现,DogProxy已包含大部分功能。

我可以公开继承DogProxy::setSource(Dog *),但这样做会产生不一致,因为隐藏GermanShepardProxy 违反了DogProxyGermanShepardProxy的原则。 我可以使用受保护的继承,但是Dog不再是Dog,因此非常无用。

总结一下:如上所述{@ 1}},DogProxyGermanShepard,如何有效地设计GermanShepardProxyDog应该是DogProxy但不是case一个update t set Gender = (case when Gender = 'F' then 'M' else 'F' end) where Gender in ('F', 'M');

1 个答案:

答案 0 :(得分:0)

  

我可以公开继承DogProxy,但这样做我有一个   不一致,因为隐藏DogProxy :: setSource(Dog *)违反了   GermanShepardProxy是DogProxy的原则。

正如您所说,GermandShepardProxyDogProxy,那么GermanShepardProxy必须实施setSource(Dog *)。因为这就是DogProxy

您声明的目标彼此冲突。如果GermandShepardProxyDogProxy,则会实施此方法。如果没有,那就不是。

听起来像你需要重构你的类层次结构。 Dog的直接子类可能不应该是您的DogProxy,而是具有两个代理的所有常见共享功能的其他内容。然后,DogProxy子类,仅实现其setSource()方法,GermandShepardProxy也将其子类化,并实现自己的setSource()方法。