从两个源继承方法的类

时间:2014-05-30 09:28:46

标签: java

很难解释,但显示一段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需要实现这些方法,这就是我想要避免的。只是为了不写两次相同的代码(我有其他几个类,其中一些也可能想要实现这些方法)。

抽象类

我仍然需要同时从两个类继承。


那么推荐的解决方案是什么?

5 个答案:

答案 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 PatternStrategy Pattern

在这两种情况下,您都将受益于Interfaces和Composition。

答案 4 :(得分:0)

  

你的类Test需要实现方法本身,这就是我想要避免的。

嗯,是的,但是“实现”可能只是一个简单的委托(并且您的IDE可以自动为此包装器创建代码)。

 public String one(){
    return foo.one();
 }

实际代码可以在Foo类中,并在许多类之间共享(如“used”中所用)。