2010-01-27 65 views
12

我知道在Java中我们不能扩展最终类。但是,有没有其他办法可以让我扩大最终课程的效果?相当于扩展Java中的最终类

因为我有一个最终的课程,满足了我所期望的要求,所以如果我能以某种方式重复使用它,那对我来说会有很大的帮助。

回答

27

为最终课程创建包装?

事情是这样的:

class MyClass { 
    private FinalClass finalClass; 

    public MyClass { 
     finalClass = new FinalClass(): 
    } 

    public void delegatingMethod() { 
     finalClass.delegatingMethod(); 
    } 
} 

包装类像MyClass将不被接受为FinalClass一个实例。如果FinalClass实现了任何接口,您可以在MyClass中实现它们,以使类更相似。 FinalClass的任何非最终父母也是如此;在这种情况下,您的MyClass设计应该与那些父类兼容。

甚至可以在运行时使用反射来创建包装类。在这种情况下,您可以使用Proxy class。请注意,代理类确实需要深入了解Java类型系统。

+1

实际上,只有被封装的类实现了某种接口/抽象类并且你可以提供一个包装器实例来代替原来的东西时,这才有效。如果你不能做到这一点,那么在重构原始文件时就很难做到这一点。 – 2010-01-28 08:07:43

+0

当然,你不能用MyClass替换FinalClass的所有实例。但是你可以定义你自己的接口来把FinalClass包装到MyClass中。永远不要在MyClass之外引用FinalClass。 – Arne 2010-01-28 09:13:51

+0

@ArneJan,你的意思是我不应该引用任何其他类中的'finalClass'字段吗?为什么? – 2013-07-15 14:34:19

3

最简单的选择是编写一个封装器,其中包含最终类的实例作为成员变量,并充当最终类的代理。

这样,很容易覆盖或扩展最终类的方法。