【发布时间】:2017-02-18 20:52:52
【问题描述】:
可能是一个愚蠢的问题,但假设类 Node 有一个名为 strength 的实例变量。并且假装扩展 Node 的 Episode 类不需要 strength(其他子类需要)。还假设有很多情节节点都存储 strength 的实例。 Java 中有没有办法说“这个子类没有 strength 变量”?我有点明白为什么这可能是不允许的,但我想我会检查一下。
更新:谢谢大家。正如我所怀疑的,这个问题的答案是“否”,但是使用 Episode 不需要的变量/方法创建 Node 的子类,然后将需要这些变量/方法的其他(子)子类连接到新的子类就可以了正是我想要的。
【问题讨论】:
-
不,因为根据 Liskov 替换原则,子类必须完成超类所做的一切。
-
不,没有。您可以通过封装使变量不可访问,但是如果有这么多子类不需要超类的字段,那么您的设计就有缺陷。
-
只需将
strength排除在Node之外,然后创建一个仅添加strength的子类。Episode可以扩展Node并且您需要strength的其他类可以扩展新创建的子类。这样他们都将拥有父Node... -
你完全可以在 Java 中做到这一点,尽管这通常(总是)不是一个好主意。这并不容易,因为您必须创建一个在动态加载时修改类的自定义类加载器,但要诚实地回答您的问题:是的,这是可能的。下面是关于在运行时添加代码的有趣读物。删除代码使用大致相同的过程。 javaworld.com/article/2071777/design-patterns/… 我没有把这个作为答案,因为 SO 社区通常思想过于封闭,无法跳出框框思考。
-
* 抱歉。先前评论中的那篇文章不涵盖所解释的程序。有关更多信息,BCEL 文档将是查看 commons.apache.org/proper/commons-bcel 的好地方
标签: java inheritance subclass instance-variables