很难解释,但显示一段Ruby代码很简单:
有两个实现方法的模块:
module Foo
def one
print "ONE!"
end
end
module Bar
def two
print "TWO!"
end
end
有一个包含它们的课程:
class Test
include Foo
include Bar
end
现在,您的班级Test
可以调用这两种方法。
据我所知,Java中没有这样的东西。关闭的概念是:
多重继承
Java不支持。
接口
他们是方法合同 - 没有实施。你的班级Test
需要实现这些方法,这就是我想要避免的。只是为了不写两次相同的代码(我有其他几个类,其中一些也可能想要实现这些方法)。
抽象类
我仍然需要同时从两个类继承。
那么推荐的解决方案是什么?
答案 0 :(得分:5)
在Java 8中,您可以使用default
方法实现此目的,但这绝不是default
的意图所以这可能是一个糟糕的建议:
interface Foo {
default void one () {
System.out.println("ONE!");
}
}
interface Bar {
default void two () {
System.out.println("TWO!");
}
}
class FooBar implements Foo, Bar {
}
public void test() {
FooBar fooBar = new FooBar();
fooBar.one();
fooBar.two();
}
但是,我想重申@Thomas在评论中所说的内容多重继承的需要通常是设计缺陷的标志。
答案 1 :(得分:3)
赞成合成而不是继承。所以你的类将引用两个实现类。
MyClass {
ClassA
ClassB
}
两次子类化的替代方案对我来说似乎相当hacky并且会导致不必要的复杂继承树。
或者使用java 8的新静态方法(与可以覆盖的默认方法相反)。有关示例,请参阅comparator。
interface X
{
static void foo()
{
System.out.println("foo");
}
}
interface Y
{
static void bar()
{
System.out.println("bar");
}
}
MyClass implements X, Y {
public static void main(String args[])
X.foo();
}
接口名称必须用作前缀,因为静态方法是接口的一部分。
答案 2 :(得分:3)
最简单的解决方案是创建层次继承:
public class foo
{
public void one()
{
System.out.println("ONE!");
}
}
public class bar extends foo
{
public void two()
{
System.out.println("TWO!");
}
}
class Test extends bar
{
//this class now has access to both methods from the two classes
}
答案 3 :(得分:0)
很少有解决方案可以解决您的问题。您可以使用Visitor Pattern或Strategy Pattern。
在这两种情况下,您都将受益于Interfaces和Composition。
答案 4 :(得分:0)
你的类Test需要实现方法本身,这就是我想要避免的。
嗯,是的,但是“实现”可能只是一个简单的委托(并且您的IDE可以自动为此包装器创建代码)。
public String one(){
return foo.one();
}
实际代码可以在Foo类中,并在许多类之间共享(如“used”中所用)。