寻找设计模式:没有子类的方法重写
Looking for design pattern: Method overriding without subclassing
考虑以下场景:我有一个由 Part 1
、Part 2
等各个部分组成的 class A
,我想扩展其功能A
由 subclassing.
问题:如果我试图以同样的方式覆盖个体 "Parts" 的行为(有更好的术语吗?),我将不得不为每个部分创建一个子 class那会改变,很快就会变得混乱和混乱。
In a nutshell: I want to override class methods without resorting to
subclassing.
我想到了一个解决方案,但我不确定这是否是个好主意:
假设我想覆盖 Part::Method
。我可以 "fake" 一种覆盖能力,而不是使用我的语言提供的继承机制:
- 向
Part
class 传递函数 MethodOverride
(例如作为匿名函数),以及
- 有
Part::Method
调用 MethodOverride
我可以看到这种方法的两个缺点:
- 它忽略了语言的(完全有能力但不切实际的)继承特性,这可能会产生无法预料的副作用
- 访问
Part
的非 public 成员变得很麻烦
My question(s): Is there an established design pattern that solves the
described issue in a similar (or better) way? Are there any downsides
I missed?
当您想避免 subclassing 但仍需要提供一组 classes 相关算法的能力时,您通常会查看访问者模式。
每个 class 将组成一个访问者对象,并调用其中一个函数。这消除了 subclass 多个对象只是为了获得一个方法的需要。
正如上面提到的,您传递方法覆盖的示例与策略模式非常相似,但是根据您的 post...
I would have to create one subclass for each Part that changes
我假设重点是避免创建多个 classes,只提供有限的功能。您的方法覆盖示例和策略模式都需要 class 每个不同的 override/strategy (算法)。
访问者只加一个class,所有逻辑都在访问者class里。无需多次subclass,只需将新算法添加到访问者具体实现中即可。
考虑以下场景:我有一个由 Part 1
、Part 2
等各个部分组成的 class A
,我想扩展其功能A
由 subclassing.
问题:如果我试图以同样的方式覆盖个体 "Parts" 的行为(有更好的术语吗?),我将不得不为每个部分创建一个子 class那会改变,很快就会变得混乱和混乱。
In a nutshell: I want to override class methods without resorting to subclassing.
我想到了一个解决方案,但我不确定这是否是个好主意:
假设我想覆盖 Part::Method
。我可以 "fake" 一种覆盖能力,而不是使用我的语言提供的继承机制:
- 向
Part
class 传递函数MethodOverride
(例如作为匿名函数),以及 - 有
Part::Method
调用MethodOverride
我可以看到这种方法的两个缺点:
- 它忽略了语言的(完全有能力但不切实际的)继承特性,这可能会产生无法预料的副作用
- 访问
Part
的非 public 成员变得很麻烦
My question(s): Is there an established design pattern that solves the described issue in a similar (or better) way? Are there any downsides I missed?
当您想避免 subclassing 但仍需要提供一组 classes 相关算法的能力时,您通常会查看访问者模式。
每个 class 将组成一个访问者对象,并调用其中一个函数。这消除了 subclass 多个对象只是为了获得一个方法的需要。
正如上面提到的,您传递方法覆盖的示例与策略模式非常相似,但是根据您的 post...
I would have to create one subclass for each Part that changes
我假设重点是避免创建多个 classes,只提供有限的功能。您的方法覆盖示例和策略模式都需要 class 每个不同的 override/strategy (算法)。
访问者只加一个class,所有逻辑都在访问者class里。无需多次subclass,只需将新算法添加到访问者具体实现中即可。