【问题标题】:Looking for design pattern: Method overriding without subclassing寻找设计模式:没有子类化的方法覆盖
【发布时间】:2015-08-12 21:55:08
【问题描述】:

考虑如下场景:我有一个类APart 1Part 2等各个部分组成,我想通过子类化扩展A的功能。

问题:如果我试图以同样的方式覆盖单个“部件”的行为(有更好的术语吗?),我将不得不为每个发生变化的部件创建一个子类,这很快就会变得混乱和混乱.

简而言之:我想重写类方法而不求助于 子类化。

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

假设我想覆盖Part::Method。不使用我的语言提供的继承机制,我可以通过以下方式“伪造”一个覆盖能力:

  • Part 类传递给函数MethodOverride(例如,作为匿名函数),并且
  • Part::Method 呼叫MethodOverride

我认为这种方法有两个缺点:

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

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

【问题讨论】:

  • 听起来您在描述strategy pattern,但我不清楚您所说的Part 到底是什么意思。可能会通过将每个部分分成自己的类来改进设计。
  • 如果您指定什么是 A、第 1 部分、第 2 部分,您可能会得到更好的答案...上下文有很大的不同。

标签: design-patterns subclassing overriding


【解决方案1】:

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

每个类将组成一个访问者对象,并调用其中一个函数。这消除了为了获取方法而对多个对象进行子类化的需要。

Visitor Pattern Example

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

我必须为每个发生变化的部分创建一个子类

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

Strategy Pattern Example

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

【讨论】:

  • 我不认为这个例子是访客。将其与链接示例进行比较:存在显着差异。
  • @jaco0646 我试图举一个小例子,算法是如何包含在一个类中的,并且为了简洁而跳过了接口。该链接是一个完整的示例,但该示例是我最好的尝试来展示一个类的概念,该类包含将在一个地方实现的内容,以避免使用最少的代码进行子类化。
  • @jaco0646 我改变了主意。演示概念的错误示例只会令人困惑。我也不认为创建一个完整的长示例来猜测他的课程是做什么的……所以我只是删除了它。理想情况下,链接就足够了。
  • 感谢您的回答,请原谅延迟。访问者模式,经过一番调查,结果正是我所需要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 2011-01-13
相关资源
最近更新 更多