【发布时间】:2012-11-08 17:40:05
【问题描述】:
这是我现在真正面临的问题。
我有一个类,比如说Foo,这个类定义了一个名为getBar 的方法,它返回一个Bar 实例。 Bar 类在 Foo 内部定义并声明为 public static final。我想做的是定义一个扩展Foo 的类MyFoo,但我还想通过添加我自己的功能(方法、属性等)来扩展Bar 和MyBar。
我也想让getBar返回MyBar。
问题是Bar 是最终的。这是我想要做的说明:
public class Foo {
Bar bar = new Bar();
public Bar getBar(){
return bar;
}
....
public static final class Bar {
}
}
我想做的是:
public class MyFoo extends Foo {
public MyBar getBar(){ // here I want to return an instance of MyBar
}
public static final class MyBar extends Bar { // That's impossible since Bar is final
}
}
我怎样才能做到这一点?
[编辑] 我正在为我的问题添加更多细节。
我实际上正在为 Jenkins 开发一个插件,在搜索之后,我意识到有一个插件提供了我想做的基本功能,Foo 和 Bar。我想自定义Foo 和Bar,所以它可以满足我的需要。
Foo 是插件的主类,并扩展了一个名为 Builder 的类。 Foo 定义了一个名为perform 的方法,其中包含执行构建的所有操作。
Bar 包含用于配置目的的操作,Foo 需要 Bar 来获取这些信息。
所以我想做的是用MyFoo 扩展Foo 并用MyBar 添加一些配置。如您所见,MyFoo 需要通过调用 getBar(); 来获取这些配置
第二件事是我无法控制MyFoo和MyBar的实例化
阻碍我的是,我无法扩展 Bar。我怎样才能做到这一点?
【问题讨论】:
-
由于
final修饰符阻止您继承Bar,我建议“包装”它。 -
如果
Bar是final class,通常是有充分理由的,例如也许是因为Foo的一些不变量需要这样做。所以我不会那样做,或者至少你应该准确地理解所有相关的源代码,并可能重写它。 -
请
Bar的开发人员将其设为非最终版本或按照mre 的建议使用委托。 -
理想情况下,
Bar将实现一个接口IBar,应用程序的其余部分针对该接口进行编码。在一个不完全属于设计内部的简单类上使用final可能是一种设计气味。 (就像返回给 API 客户端的类一样。) -
谢谢你的回答,伙计们。我怎样才能“包裹”酒吧?