考虑以下定义和实现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()期望FooImplFoo实现并将Foo强制转换为FooImpl,以便它可以调用程序包专用方法hiddenMethod()

我的问题是,我对将Foo强制转换为FooImpl并不感到疯狂。我可以用另一种模式来做同样的事情吗?

提前致谢...

最佳答案

这里的问题是您隐式地违反了封装原理。您的类中有一个方法,该方法取决于实现,因此不属于Foo接口。这是对OO负责人的侵犯,这只是冰山一角。如果要设计一个新的Foo实现类,该类没有要调用的方法怎么办?

您应该重新设计代码,以便可以从Foo接口中仅实现此调用方法。

10-04 21:03