Java继承和包装

Java继承和包装,java,inheritance,code-generation,wrapper,Java,Inheritance,Code Generation,Wrapper,我有一个生成的对象,我想: 保留的现有功能,而无需注入构造函数并重写每个方法来调用injectedObject.sameMethod() 向生成的对象添加附加功能,而不修改生成的对象 将附加功能添加到 例如: public class GeneratedObject { public String getThis() { ... } public String getThat() { ... } } public interface ObjectWrapper { St

我有一个生成的对象,我想:

  • 保留的现有功能,而无需注入构造函数并重写每个方法来调用
    injectedObject.sameMethod()
  • 向生成的对象添加附加功能,而不修改生成的对象
  • 将附加功能添加到

    例如:

    public class GeneratedObject {
        public String getThis() { ... }
        public String getThat() { ... }
    }
    
    public interface ObjectWrapper {
        String doThisWithThat();
    }
    
    public class ObjectWrapperImpl extends GeneratedObject implements ObjectWrapper {
        String doThisWithThat() { ... }
    }
    

    但是,向下转换是不允许的,如果不重写一堆冗余代码来包装对象,那么正确的实现是什么?

    我认为可能会对您有所帮助:“decorator模式可以用于在运行时扩展(装饰)某个对象的功能,而不依赖于同一类的其他实例”您尝试过aspectj吗?这有点复杂,但您的请求也有点复杂。

    如果您可以从
    GeneratedObject
    提取接口,则可以使用。您将创建一个代理,该代理实现了提取的接口和
    ObjectWrapper
    ,并使用调用处理程序将
    GeneratedObject
    接口中对方法的所有调用传递给委托,并将
    doThisWithThat()
    调用发送到其他地方


    代理并不漂亮,但丑陋至少是很好地本地化了。

    在不修改生成对象的情况下为生成的对象添加附加功能。
    如果我理解正确,这听起来像是
    我想在房间里加一张桌子,而不去碰房间。
    我希望矛盾是显而易见的。此外,我不完全理解这个问题。这个例子有什么关系?可能是组合而不是继承?@cklab为了符合你的类比,我想说的是,
    我想在房间外面加一张桌子,同时还能进入我的房间
    不。在decorator模式中,您完全需要重写所有委托给支持实例的方法。-1:似乎他无法控制
    GenerateObject
    。在这种情况下,必须使用动态代理(至少部分)实现装饰器模式。