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

Java 对于某些类,当接口方法的实现相同时,您如何处理?,java,class,oop,design-patterns,interface,Java,Class,Oop,Design Patterns,Interface,假设我已经用foo和bar方法定义了接口。 例如 假设我有A类和B类,对它们来说实现接口是有意义的。但是对于foo() 考虑到从B中导出A或从A中导出B是不正确/怪异的,是否有此设计的标准编码实践? 我假设我可以创建一些实用程序类来实现foo(),并将其作为委托调用,但我想知道是否可以以不同的方式处理整个结构 更新: 为了充分理解我的问题,我偶然发现了这样一个问题:我试图理解在Java中使用传统的OO概念时,这个特性是否缺乏决定将我的评论变成一个答案: 您可以使用抽象类而不是接口: pu

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

假设我有A类和B类,对它们来说实现接口是有意义的。但是对于
foo()

考虑到从B中导出A或从A中导出B是不正确/怪异的,是否有此设计的标准编码实践?
我假设我可以创建一些实用程序类来实现
foo()
,并将其作为委托调用,但我想知道是否可以以不同的方式处理整个结构

更新:

为了充分理解我的问题,我偶然发现了这样一个问题:我试图理解在Java中使用传统的OO概念时,这个特性是否缺乏

决定将我的评论变成一个答案:

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

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

        abstract void bar();  
    } 

    public class A extends FooBar{

        @Override
        public void bar(){

        }
    }

为什么不这样做:

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

class A extends SomeAbstractClass {

}

class B extends SomeAbstractClass {

}

或者,如果您不想通过扩展抽象类将A和B捆绑在一起,您可以使用组合。如果要将
FooImpl
作为构造函数的一部分注入,这还提供了在运行时更改
IFoo
行为的灵活性。在本例中,为了简洁起见,我刚刚硬连接了
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
    }
}

您的编辑表明,您真正的问题是:“Java中的Perl角色是否有等价物?”

由于Java8在接口中引入了
default
方法,因此具有默认方法的接口对于角色来说似乎是一个非常好的等价物。特别是,您可以在示例中执行您想要的操作:为
foo()
提供默认实现:


如果有关于我缺少的角色的功能,请让我知道。否则,我认为Java8接口是一个相当好的角色代理。

为什么不将接口创建为一个抽象类,并为foo()提供一个实现呢,您可以提供一个或始终遵循敏捷宣言,通过创建一个能够执行该功能的合作者来选择has-a关系。A和B将与接口保持is-A关系,与合作者保持has-A关系。@Dan Temple:请参阅更新如果我理解正确,您正在寻找一种在Java中用角色表示多重继承的方法。正如文章中指出的,Java不支持多重继承,因此抽象类在这里不会有太大帮助。但是您可以实现多个接口,这可能有助于让您感受角色。我想知道Java8中的默认方法是否与Perl5中的默认实现相比较。@DanTemple:老实说,我不认为需要“角色”。所以我想知道这是否是我们在Java中使用的OO的一个遗漏,你是对的。我主要担心的是,老实说,我不认为需要“角色”。所以我想知道这是否是我们在中使用的OO的遗漏Java@Jim:老实说,角色在我看来很像通常的特征(即与实现的接口)。主张角色完全不同的作者只是试图给他们另一种“外观”,但在他们的核心,我认为与通常的多重继承没有太大区别……您将实现额外的接口,并提供类似于
IFoo+FooImpl
(如上所示)的帮助器类这将包含所需行为的实现。这是否意味着该功能是必需的,并且是缺失的?因为根据你的建议,我需要编写一个全新的helper类层次结构not missing.Java是一种静态类型语言,因此编译器需要知道类支持方法。实现一个接口是java表达这一点的方式。创建大量特定的小类实际上是很好的OO设计(考虑单一责任原则)。如果做不到这一点,您的设计可能更适合功能性方法
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..
    }
}
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
    }
}
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
}