假设我已经使用方法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中使用它们
答案 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
}
}