【问题标题】:Java "extending" an objectJava“扩展”一个对象
【发布时间】:2011-05-07 07:11:00
【问题描述】:

我最近才回到 Java 编程领域,目前遇到一个问题。

我有一个特定类型的对象:

StandardClass stdClass = (StandardClass)request.getAttribute(ATTR);  

但现在我需要让 Object stdClass 成为某个 Observable 的 Observer。
由于 StandardClass 没有实现 Observer 接口,因此我无法直接将其添加为观察者。 所以我尝试了:

ExtendedClass extends StandardClass implements Observer { ... }

但我一直无法找到将原始对象转换为新类的方法。

可能整个方法是完全错误的,我目前无法只见树木不见森林,因此,如果您能就如何解决此类问题提供任何意见,我将不胜感激。

非常感谢您的宝贵时间和帮助,我真的很感激!

干杯,
托马斯

【问题讨论】:

  • 你不能让StandardClass实现Observer吗?

标签: java inheritance interface casting observer-pattern


【解决方案1】:

您将无法将原始对象转换为ExtendedClass,因为它不是该类的实例。子类的存在并不意味着超类实例可以以某种方式强制进入这些子类。在这种情况下,您的stdClass 对象只是StandardClass 的一个实例,因此无法成功向下转换。

编辑澄清:当然,存储在 StandardClass 变量中的某些对象实际上很可能是 ExtendedClass 对象。我的理解是您没有修改存储在请求中的实际对象,只是创建了一个子类。当您说您无法执行强制转换时,我假设您的意思是在运行时使用ClassCastException 进行强制转换失败(编译器将拒绝某些强制转换,因为它们无法成功,例如Integer 永远无法转换为String,但这不应该是其中一种情况)。如果您创建了子类并修改了您的应用程序,以便将存储在请求中的对象创建为 ExtendedClass 对象,那么转换应该会成功。

为了实现您想要做的事情,更简洁的方法是某种wrapper class,它包含一个StandardClass 实例并实现Observer 方法本身。然后它可以在 StandardClass 上调用适当的方法来响应观察到的事件。

【讨论】:

  • 非常感谢您的意见!实际上我之前使用过包装类方法,但问题是,StandardClass 有一个超时功能,在这种情况下,它必须通知包装类从 observable 中注销自己。
【解决方案2】:

如果request.getAttribute(ATTR) 处的对象确实是Observable,那么您可以这样转换:

Observable obs = (Observable) request.getAttribute(ATTR);

如果编译器知道StandardClass 不是Observable,它将不允许您从一种类型转换为不兼容的类型。或者,您可以简单地将引用声明为 ExtendedClass。

【讨论】:

    【解决方案3】:

    用你的方法:

    request.getAttribute(ATTR);
    

    应该返回一个 ExtendedClass 的对象类型,以便将其转换为 Observer,例如:

    Observer observer = (Observer) request.getAttribute(ATTR);
    

    【讨论】:

      【解决方案4】:

      如果您需要视觉效果,请查看观察者模式图

      http://upload.wikimedia.org/wikipedia/commons/8/8d/Observer.svg

      【讨论】:

        猜你喜欢
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 2015-04-29
        相关资源
        最近更新 更多