Java多继承设计模式?

时间:2011-12-04 06:07:20

标签: java android design-patterns

我有这个结构:

Class1

Class2 extends Class1

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

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

Class3 extends Class2 AND MapActivity.

无法完成。

将我的class3更改为仅扩展MapActivity将要求我修改先前开发人员继承的大量代码(无双关语)。

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

最好的方法是什么?

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

5 个答案:

答案 0 :(得分:2)

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

OR

您可以简单地Class1扩展MapActivity,除非它已经扩展了其他内容,但如果Class2应该扩展MapActivity,您真的只想这样做。您的Class2可以延长Class1Class3可以延长Class1Class1可以延长MapActivity

希望这有帮助!

答案 1 :(得分:1)

从我所看到的,这个问题最像java的解决方案如下。

  1. 通常,尝试使用接口来定义需要扩展的类型。例如,JTable使用TableModel界面,可以从头开始实施,也可以通过扩展AbstractTableModelDefaultTableModel

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

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

答案 2 :(得分:0)

为什么不尝试实现它,而不是让第3类扩展MapActivity? 我遇到了一个非常类似的问题,并使用工具解决了它。

答案 3 :(得分:0)

您可以创建扩展MapActivity的Class4,并将Class3用作Class4中的合成。然后你可以委托给Class3的apis。显然,如果不需要访问Class3及以上的某些内部,这将有效。

如果您需要访问Class3的内部,那么您可以使用Class5扩展Class3来创建api,这可以帮助克服无法访问内部的限制。

答案 4 :(得分:0)

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