考虑以下代理模式的情况。 (不确定这真的是一个“代理模式”,但我会继续使用它。)
我获得了一个类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 *)
,虽然这不是约束,但在我看来它才有意义。
我希望GermanShepardProxy
以DogProxy
的形式实现,DogProxy
已包含大部分功能。
我可以公开继承DogProxy::setSource(Dog *)
,但这样做会产生不一致,因为隐藏GermanShepardProxy
违反了DogProxy
是GermanShepardProxy
的原则。
我可以使用受保护的继承,但是Dog
不再是Dog
,因此非常无用。
总结一下:如上所述{@ 1}},DogProxy
和GermanShepard
,如何有效地设计GermanShepardProxy
,Dog
应该是DogProxy
但不是case
一个update t
set Gender = (case when Gender = 'F' then 'M' else 'F' end)
where Gender in ('F', 'M');
?
答案 0 :(得分:0)
我可以公开继承DogProxy,但这样做我有一个 不一致,因为隐藏DogProxy :: setSource(Dog *)违反了 GermanShepardProxy是DogProxy的原则。
正如您所说,GermandShepardProxy
是DogProxy
,那么GermanShepardProxy
必须实施setSource(Dog *)
。因为这就是DogProxy
。
您声明的目标彼此冲突。如果GermandShepardProxy
是DogProxy
,则会实施此方法。如果没有,那就不是。
听起来像你需要重构你的类层次结构。 Dog
的直接子类可能不应该是您的DogProxy
,而是具有两个代理的所有常见共享功能的其他内容。然后,DogProxy
子类,仅实现其setSource()
方法,GermandShepardProxy
也将其子类化,并实现自己的setSource()
方法。