【问题标题】:Can a class instance variable be excluded from a subclass in Java?可以从Java中的子类中排除类实例变量吗?
【发布时间】: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 社区通常思想过于封闭,无法跳出框框思考。
  • * 抱歉。先前评论中的那篇文章不涵盖所解释的程序。有关更多信息,B​​CEL 文档将是查看 commons.apache.org/proper/commons-bcel 的好地方

标签: java inheritance subclass instance-variables


【解决方案1】:

不,这是不可能的。你可以有例如NodeStrengthNode 类,一个没有强度,一个有强度,然后Episode 类将扩展Node,其他将扩展StrengthNode

另外,考虑到 Java 中的 access control,好像 strengthNode 中的 private 变量,在 Episode 类中将无法直接访问它(仅使用getter 方法),但它的实例无论如何都会存在于内存中。

【讨论】:

  • 我使用了类似的东西(直接查看 brso05 对问题的回答)。我使用了一个没有 Episode 不需要的东西的 Node 类,然后使用了一个带有(子)子类使用的其他东西的 node 子类。即节点 -> 情节加节点 -> 子节点 -> 输入、身份、响应、决策、目标等。
【解决方案2】:

好吧,我能想到的唯一方法是,如果您的实例变量存储的对象大小有问题,您可以将参数初始化为 null,或者您可以通过将实例参数指定为瞬态来序列化对象并继续用序列化它,反序列化它。

这只是一个想法,想不到更接近的东西。

如果您特别不需要精确的继承,您可以通过创建自定义工厂并使用反射提取成员变量来解决这个问题,这也可以。

这就是我的看法。

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多