当某些类的接口方法的实现相同时,您如何处理?

时间:2014-07-25 07:52:39

标签: java class oop design-patterns interface

假设我已经使用方法foo和bar定义了接口ISomeInterface 例如。

public interface ISomeInterface {  
    public void foo();  
    public void bar();  
} 

让我们说我有A类和B类,对他们来说,实现接口是有意义的。但是对foo()实现不同的实现也没有意义 考虑到从A中从B或B导出A是不正确/怪异的,这种设计是否有标准的编码实践? 我假设我可以创建一些实用程序类来实现foo()并将其称为委托,但我想知道整个结构是否可以用不同的方式处理

更新
为了充分理解我的问题,我偶然发现了这个问题:http://perlbuzz.com/2010/07/why-roles-in-perl-are-awesome.html我试图了解传统的OO概念是否缺少此功能,因为我们在Java中使用它们

5 个答案:

答案 0 :(得分:4)

您的编辑表明您的真正问题是:" Java中的Perl角色是否相同?"

由于Java 8在接口中引入了default方法,因此使用默认方法的接口看起来非常类似于角色。特别是,您可以在示例中执行所需操作:为foo()提供默认实现:

interface ISomeInterface {
    public default void foo(){ /* your default impl goes here */}
    public void bar(); // Abstract, must be implemented by subclasses
}

class A implements ISomeInterface {
    // must only implement bar, can reuse foo's default impl
}

class B implements ISomeInterface {
    // must only implement bar, can reuse foo's default impl
}

如果有关于我缺少的角色的功能,请告诉我。否则,我认为Java8接口是角色的一个很好的替代品。

答案 1 :(得分:1)

决定将我的评论转为答案:

您可以使用抽象类而不是接口:

    public abstract class FooBar {  
        public void foo(){
       //your implementation goes here  
        }

        abstract void bar();  
    } 

    public class A extends FooBar{

        @Override
        public void bar(){

        }
    }

答案 2 :(得分:1)

为什么不这样:

public class abstract SomeAbstractClass {  
    public void foo(){
       //implementation
    }  
    public abstract void bar();  
} 

class A extends SomeAbstractClass {

}

class B extends SomeAbstractClass {

}

答案 3 :(得分:1)

public abstract class SomeClass implements ISomeInterface {
    public void foo() {
        // I do stuff..
    }
}

public class A extends SomeClass {
    public void bar() {
        // A specific impl. of bar..
    }
}

public class B extends SomeClass {
    public void bar() {
        // B specific impl. of bar..
    }
}

答案 4 :(得分:1)

或者,如果您不希望通过扩展抽象类来绑定A和B,则可以使用合成。如果您要将IFoo作为构造函数的一部分注入,这还可以灵活地在运行时更改FooImpl行为。在这个例子中,为了简洁,我刚刚连接了FooImpl

public class B implements ISomeInterface {

    private IFoo foo = new FooImpl();

    public void foo() {
        foo.doSomethingFooey();
    }

    public void bar() {
        // B specific implementation        
    }
}

public class A implements ISomeInterface {

    private IFoo foo = new FooImpl();

    public void foo() {
        foo.doSomethingFooey();
    }

    public void bar() {
        // A specific implementation
    }
}