考虑以下定义和实现Foo
接口的类:
public class MyClass {
public Foo getFoo() {
return new FooImpl();
}
public void fooMethod(Foo foo) {
final fooImpl = (FooImpl) foo;
fooImpl.hiddenMethod();
}
public interface Foo {
void doSomething();
}
private class FooImpl implements Foo {
public void doSomething();
void hiddenMethod() {
}
}
}
外部类将调用
MyClass.getFoo()
以获取Foo
对象,并将其传递回fooMethod()
。 fooMethod()
期望FooImpl
的Foo
实现并将Foo
强制转换为FooImpl
,以便它可以调用程序包专用方法hiddenMethod()
。我的问题是,我对将
Foo
强制转换为FooImpl
并不感到疯狂。我可以用另一种模式来做同样的事情吗?提前致谢...
最佳答案
这里的问题是您隐式地违反了封装原理。您的类中有一个方法,该方法取决于实现,因此不属于Foo接口。这是对OO负责人的侵犯,这只是冰山一角。如果要设计一个新的Foo实现类,该类没有要调用的方法怎么办?
您应该重新设计代码,以便可以从Foo接口中仅实现此调用方法。