请考虑以下情形:我有一个由A
,Part 1
等各个部分组成的课程Part 2
,我希望扩展A
的功能子类。
问题:如果我试图覆盖个人的行为"部件" (有更好的术语吗?)同样的方法,我必须为每个更改的Part创建一个子类,这会变得混乱和快速混淆。
简而言之:我想在不诉诸的情况下覆盖类方法 子类。
我想到了一个解决方案,但我不确定这是不是一个好主意:
假设我想覆盖Part::Method
。而不是使用我的语言提供的继承机制,我可以"假"最重要的能力:
Part
类传递给函数MethodOverride
(例如作为匿名函数),Part::Method
来电MethodOverride
我可以看到这种方法的两个缺点:
Part
的非公开成员变得麻烦我的问题:是否有一种既定的设计模式可以解决问题 以类似(或更好)的方式描述问题?有没有缺点 我错过了?
答案 0 :(得分:1)
当您想要避免子类化但仍需要提供一组类相关算法的能力时,您通常会查看访问者模式。
每个类都将组成一个访问者对象,并调用其中一个函数。这样就不需要为了获得方法而对多个对象进行子类化。
如上所述,传递方法覆盖的示例与策略模式非常相似,但根据您的帖子...
我必须为每个更改的部件创建一个子类
我认为重点是避免创建多个类,只提供有限的功能。您的方法覆盖示例和策略模式都需要每个不同覆盖/策略(算法)的类。
访问者只添加一个类,并将所有逻辑保留在访问者类中。无需多次子类化,只需将新算法添加到访问者的具体实现中。