寻找设计模式:方法重写没有子类化

时间:2015-08-12 21:55:09

标签: design-patterns subclassing method-overriding

请考虑以下情形:我有一个由APart 1等各个部分组成的课程Part 2,我希望扩展A的功能子类。

问题:如果我试图覆盖个人的行为"部件" (有更好的术语吗?)同样的方法,我必须为每个更改的Part创建一个子类,这会变得混乱和快速混淆。

  

简而言之:我想在不诉诸的情况下覆盖类方法   子类。

我想到了一个解决方案,但我不确定这是不是一个好主意:

假设我想覆盖Part::Method。而不是使用我的语言提供的继承机制,我可以"假"最重要的能力:

  • Part类传递给函数MethodOverride(例如作为匿名函数),
  • Part::Method来电MethodOverride

我可以看到这种方法的两个缺点:

  • 它忽略了语言的(完全有能力但不切实际)继承功能,可能会产生无法预料的副作用
  • 访问Part的非公开成员变得麻烦
  

我的问题:是否有一种既定的设计模式可以解决问题   以类似(或更好)的方式描述问题?有没有缺点   我错过了?

1 个答案:

答案 0 :(得分:1)

当您想要避免子类化但仍需要提供一组类相关算法的能力时,您通常会查看访问者模式。

每个类都将组成一个访问者对象,并调用其中一个函数。这样就不需要为了获得方法而对多个对象进行子类化。

Visitor Pattern Example

如上所述,传递方法覆盖的示例与策略模式非常相似,但根据您的帖子...

  

我必须为每个更改的部件创建一个子类

我认为重点是避免创建多个类,只提供有限的功能。您的方法覆盖示例和策略模式都需要每个不同覆盖/策略(算法)的类。

Strategy Pattern Example

访问者只添加一个类,并将所有逻辑保留在访问者类中。无需多次子类化,只需将新算法添加到访问者的具体实现中。