【问题标题】:Java multiple inheritance design pattern?Java多重继承设计模式?
【发布时间】:2011-12-04 06:07:19
【问题描述】:

我有这个结构:

Class1

Class2 扩展 Class1

我有一堆实用程序类,它们需要一个 Class2 来完成各种工作。

问题:我需要创建一个扩展 Class2 的 Class3 来使用这些类。 Class3 将有一个 Google API 的 Android MapView。 MapViews 只能从类扩展 MapActivity 中创建。我需要

Class3 extends Class2 AND MapActivity.

这是不可能的。

将我的 class3 更改为仅扩展 MapActivity 将需要我修改从以前的开发人员那里继承的大量代码(不是双关语)。

将我的 class3 更改为仅扩展 Class2 中断,因为地图需要 MapActivity。

最好的方法是什么?

编辑:有几个人提到了“界面解决方案”。听起来是正确的解决方案。不过,我忘了提到 Class2 是一个 abstract 类,移动已实现的方法会很痛苦。很多代码重复... DRY 在这个上弄湿了... :)

【问题讨论】:

  • 是否有任何类Class1 to 3 扩展了“活动”?
  • 不...这是问题的一部分
  • 顺便说一句,难以置信你们玩这个的速度有多快。我无法想象人们在 stackoverflow 之前是如何编程的...... :)
  • 查看此问题的解决方案。询问后发现:stackoverflow.com/questions/2143220/…

标签: java android design-patterns


【解决方案1】:

由于 Java 不支持多重继承,因此您需要进行变通。如果我是你,我会创建一个接口来定义你需要的所有东西,然后扩展你的 Class1

你可以简单地让Class1 扩展MapActivity,除非它已经扩展了其他东西,但如果Class2 应该扩展MapActivity,你真的只想这样做。你的Class2 可以扩展Class1,你的Class3 可以扩展Class1Class1 可以扩展MapActivity

希望这有帮助!

【讨论】:

    【解决方案2】:

    据我所见,这个问题最类似java的解决方案如下。

    1. 一般情况下,尽量使用接口来定义需要扩展的类型。比如JTable使用TableModel接口,可以从头实现,也可以扩展AbstractTableModelDefaultTableModel

    2. 可以理解,这并不总是可行的。在您的情况下,您可以使用Class1 类型的私有字段设计Class3。然后根据需要实现尽可能多的包装器方法,将所有传入的方法传递给内部对象。

    当然,(2) 将提供Class1 的所有行为,但实际上不会是Class1 的实例,这可能会破坏系统中的其他内容。对这个问题的回答是(再次)更多地使用接口。

    【讨论】:

      【解决方案3】:

      与其让类 3 扩展 MapActivity,不如尝试实现它? 我有一个和你非常相似的问题,并通过使用工具解决了它。

      【讨论】:

      • 试过了。问题是我的 Class1 扩展了 LinearLayout,如果你尝试“扩展 LinearLayout 实现 MapActivity”,你会在类之间遇到一些冲突(不记得发生了什么冲突)。
      • 注意:在其他情况下,这将是一个很好的解决方案。 (仅供参考)
      【解决方案4】:

      您能否创建扩展 MapActivity 的 Class4 并使用 Class3 作为 Class4 内部的组合。然后你可以委托给Class3的api。显然,如果不需要访问 Class3 及以上的某些内部,这将起作用。

      如果您需要访问 Class3 的内部,那么您可以让 Class5 扩展 Class3 来创建 API,这有助于克服无法访问内部的限制。

      【讨论】:

        【解决方案5】:

        是的,Niall C. 是对的。我对此并不陌生,但我知道 Java 不支持类的多重继承,而是这个您可以创建一个接口来定义您想要使用的所有方法和成员并实现它。

        【讨论】:

          猜你喜欢
          • 2013-08-16
          • 2017-02-11
          • 2019-07-20
          • 1970-01-01
          • 2011-01-19
          • 1970-01-01
          • 2014-04-15
          • 1970-01-01
          • 2011-01-09
          相关资源
          最近更新 更多