【发布时间】:2014-11-02 02:40:12
【问题描述】:
我的 Java 生锈了,这让我彻底崩溃了。我相信答案很简单,但这里有一个简单的示例方法,可以关闭一个 Thingy(如果已经打开),另一个打开:
private Thingy store;
public void switchiton(final Thingy pThingy) {
if (store != null)
store.endit();
pThingy.startit();
store = pThingy;
}
问题:pThingy 可能是子类(例如CleverThingy)而不是超类(Thingy),并且CleverThingy 覆盖了endit 方法。
该代码将始终在 Thingy 中运行 endit 方法 - 而不是在 CleverThingy 中被覆盖的方法(因为它被声明为 Thingy 而不是 CleverThingy)。
显然,该方法不知道(也不应该需要)子类。
我错过了什么盯着我的脸?
更新:
在这种情况下,子类是“动态”创建的(不确定正确的术语),而不是正式扩展 - 例如在我的Game 课程中:
startthingy = new Thingy();
gamethingy = new Thingy() {
@Override
public void endit() {
// override things in here
super.endit();
}
}
switchiton(gamethingy); // DOES call gamethingy's overridden startit
switchiton(startthingy); // << gamethingy's overridden endit is NOT called!?
【问题讨论】:
-
当
store具有对CleverThingy实例的引用值时,调用store#endit将执行CleverThingy#endit如果被正确覆盖。我不太清楚你的问题。 -
我也没有,因为我刚刚花了一个小时调试的示例没有这样做(它是正确的子类型 - 它没有调用子类型方法!)一个小因素我错过了 - 参数被声明为 Final (因为后面的代码中有一个 Runnable ) - 这很重要(编辑了问题)
-
不,没关系。请提供必要的代码来复制问题。
-
我刚刚删除了所有线程(这是一个 LibGDX 游戏),但问题仍然存在 - 唯一的其他因素是子类被声明为“动态”(不确定正确的术语) - 我将其添加到问题中
-
子类被声明为“动态”你的意思是它是一个匿名类,或者你使用像 cglib 这样的库来动态创建类?
标签: java parameters subclassing