在工作中,我在一个java项目中遇到了以下设计:
考虑接口Foo、Bar和Baz如下:
interface Bar { public int a(); }
interface Baz { public int b(); }
interface Foo extends Bar, Baz { public int c(); }
现在,考虑FooImpl类
public class FooImpl implements Foo {
private Bar bar;
private Baz baz;
public int a() {
return bar.a();
}
public int b() {
return baz.b();
}
public int c() {
return 0;
}
}这种类层次结构的用例是什么?在我看来,这引入了很多样板,除了将一个大文件分解成更小的文件之外,在抽象方面并没有增加太多。
发布于 2015-07-18 03:46:24
它允许这样的事情:
Foo foo = new FooImpl();
useBar(foo);
public void useBar(Bar bar) {
bar.a();
}这是否有用取决于实际情况。带有无意义名称的类和方法的示例代码不支持理性判断。
另外要注意的是,您的FooImpl实际上是作为Bar和Baz实例的某种包装器实现的。严格地说,这不是接口设计问题。
发布于 2015-07-18 07:02:34
我认为这是多重继承(在Java中是不允许的)的一种解决方案。您没有显示Bar和Baz的实现,但让我们假设它们是存在的:
public class BarImpl implements Bar {
@Override
public int a() {
return 1;
}
}
public class BazImpl implements Baz {
@Override
public int b() {
return 2;
}
}您还没有告诉我们如何实例化Bar和Baz属性并将其设置为FooImpl,因为如果按照问题中的说明执行,您将在FooImpl.a()和FooImpl.b()中获得NullPointerException。同样,让我们想象一下如何实现这一目标:
public class FooImpl implements Foo {
private Bar bar; // better if final
private Baz baz; // better if final
// Constructor to properly initialize bar and baz
public FooImpl(Bar bar, Baz baz) {
this.bar = bar;
this.baz = baz;
}
@Override
public int a() {
return bar.a();
}
@Override
public int b() {
return baz.b();
}
@Override
public int c() {
return 0;
}
}把所有东西连接起来:
Bar bar = new BarImpl();
Baz baz = new BazImpl();
Foo foo = new FooImpl(bar, baz);
int one = foo.bar(); // 1
int two = foo.baz(); // 2在某种程度上,FooImpl是从BarImpl和BazImpl“继承”的,尽管这是通过委托实现的。
发布于 2015-07-18 03:51:37
要做到这一点,实际上就是使用它的属性(bar和baz) "a“方法和"b”方法重定向fooimpl。
https://stackoverflow.com/questions/31487431
复制相似问题