我有3个A,B和C类。这些扩展了另一个D类。
D类有一个在所有A,B和C类中使用的方法。
现在的问题是A,B和C类应该扩展不同的类,并且只使用D类中的相同方法。
我无法相信我应该在所有课程中复制和粘贴该方法。在C中有没有类似函数的包含?
顺便说一句,我正在使用Android应用。 D类扩展了Activity,并提供了一种管理Android活动A,B和C的常用菜单的方法(这是Android文档中报告的官方方法)。但是我需要这些活动扩展不同的类,比如ActivityList,而不仅仅是Activity类。
答案 0 :(得分:6)
如果您的方法不需要访问私有状态,请在D类中添加静态方法,并从A,B,C中调用静态方法。
如果您的方法确实需要访问私有状态,请查看是否可以通过向每个类添加package-private getter来分解是否需要使用私有状态,然后使用A中的方法。
否则,尝试将一些逻辑分解为常见的接口而不是超类。
否则,尝试委托给助手类。 (例如@Marcelo表示的作文而不是继承)
否则,重复每个A,B,C类中的方法。
作为通用接口方法的一个例子,结合D:
中的静态方法interface MyThing
{
public void doMyThing(String subject);
public List<String> getThingNames();
}
class D
{
static void doSomethingComplicatedWithMyThing(MyThing thing)
{
for (String name : thing.getThingNames())
{
boolean useThing = /* complicated logic */
if (useThing)
thing.doMyThing(name);
}
}
}
class A extends SomeClass implements MyThing
{
/* implement methods of MyThing */
void doSomethingComplicated()
{
D.doSomethingComplicatedWithMyThing(this);
}
}
class B extends SomeOtherClass implements MyThing
{
/* implement methods of MyThing */
void doSomethingComplicated()
{
D.doSomethingComplicatedWithMyThing(this);
}
}
class C extends YetAnotherClass implements MyThing
{
/* implement methods of MyThing */
void doSomethingComplicated()
{
D.doSomethingComplicatedWithMyThing(this);
}
}
答案 1 :(得分:3)
您应该在每个A,B和C类定义中都有一个D类型的实例变量,并使用该实例中的方法。这样A,B和C仍然可以扩展其他类。
在这种情况下,您赞成composition而不是inheritance。
答案 2 :(得分:1)
Java不支持多重继承。一个类只能扩展一个类。 也许使用界面是个好主意。您可以创建一个包含D类方法的接口,并使类A,B和C实现此接口。我不知道这是否有帮助。以下链接可能对您有用:http://java.sys-con.com/node/37748