【发布时间】:2016-05-10 02:28:18
【问题描述】:
我想声明几个抽象方法(因此在继承自该方法的类中需要实现)以适应我的情况,即:
我正在制作一个解谜程序。到目前为止,我有 3 个包:
games.puzzlesgames.puzzles.rivercrossinggames.puzzles.rivercrossing.wolfgoatcabbage
我不想太具体,但在 games.puzzles.rivercrossing 包中,我有两个代表银行和州的类:GenericBank 和 GenericState。
现在,它们定义了一些行为,但是从这些继承的类必须具有一些方法,例如move() 将一个元素从一个银行移动到另一个银行或isPermitted()和isFinal() 检查状态。
例如,在最后一个包中,我有 WolfGoatCabbageGame 类,它必须有自己的 Bank 和 State 类,它们将从通用类继承。这些特定的Bank 和State 类必须实现我上面提到的方法,例如在狼、山羊和卷心菜游戏中,检查山羊和狼是否不在同一个银行等。
所以最初我将泛型类声明为abstract,这些方法也将被实现abstract:
public abstract class GenericBank {
// more members ...
public abstract boolean move(Element element, GenericBank dst);
// more members...
}
public abstract class GenericState {
// more members...
public abstract boolean isPermitted(GenericBank bank);
public abstract boolean isFinal(GenericBank bank);
// more members...
}
在我发现我必须实例化 GenericBank 和 GenericState 对象之前,这看起来是可行的,如果这些类是抽象的,当然不能这样做。
所以我不得不从类中删除 abstract 限定符。
那么……我该怎么办?如何在非abstract 类中声明abstract 方法(或实现相同的行为)?
【问题讨论】:
-
为什么需要实例化
GenericBank和GenericState? -
生成抽象类的对象是没有意义的,因为它没有所有的实现。考虑使用接口来解决您的问题。
-
一个简单的解决方案是在
Generic...classes 中使用空主体(即默认行为是“什么都不做”)实现这些方法,并在子类中覆盖这些方法 -
你的课程设计得很糟糕。在设计良好的系统中,不需要实例化具有
abstract方法的类。你在这里问错了问题。 -
我真的没有得到反对票。你可以说“嘿,实例化一个抽象类没有意义”或“嘿,你应该重新考虑你的类层次结构”或“嘿,这是我建议你应该做的”。但是不,让我们用反对票炒掉这个家伙,因为我可以。这就是为什么外面这么多人鄙视这个网站的原因。一些模组删除了这个问题,因为它对任何人没有帮助。
标签: java oop inheritance