Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相当于在Java中扩展最后一个类_Java - Fatal编程技术网

相当于在Java中扩展最后一个类

相当于在Java中扩展最后一个类,java,Java,我知道在Java中我们不能扩展最后一个类。但是,有没有其他方法可以让我得到延长最后一节课的效果呢 因为我有一个最终类,其中包含我正在寻找的需求,所以如果我能够以某种方式重用它,这将对我有很大帮助。最简单的选择是编写一个包装器,其中包含最终类的一个实例作为成员变量,并充当最终类的代理 这样,很容易重写或扩展最终类的方法。为最终类创建包装器 大概是这样的: class MyClass { private FinalClass finalClass; public MyClass {

我知道在Java中我们不能扩展最后一个类。但是,有没有其他方法可以让我得到延长最后一节课的效果呢


因为我有一个最终类,其中包含我正在寻找的需求,所以如果我能够以某种方式重用它,这将对我有很大帮助。

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


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

为最终类创建包装器

大概是这样的:

class MyClass {
    private FinalClass finalClass;

    public MyClass {
        finalClass = new FinalClass():
    }

    public void delegatingMethod() {
        finalClass.delegatingMethod();
    }
}
MyClass
这样的包装类不会被接受为
FinalClass
的实例。如果
FinalClass
实现了任何接口,您可以在
MyClass
中实现它们,以使这些类更加相似。
最终类
的任何非最终父类也是如此;在这种情况下,您的
MyClass
设计应该与那些父类兼容


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

在实践中,这只适用于正在包装的类实现某种接口/抽象类,并且您可以提供包装器实例来代替原始类。如果你不能做到这两件事,那么在不重构原有的基础上就很难做到。当然,你不能用MyClass替换FinalClass的所有实例。但您可以定义自己的接口,用MyClass包装FinalClass。只是永远不要引用MyClass之外的FinalClass。@ArneJan,你的意思是我不应该引用任何其他类中的
FinalClass
字段吗?为什么?GuruKuki的预期效果就像是延长了最后一节课。如果然后在包装器外部引用包装的类,那么将处理两个不同类的两个实例。。。但目标是只处理一个实例。