【问题标题】:Best practice for defining superclass instance fields based on the subclass基于子类定义超类实例字段的最佳实践
【发布时间】:2014-09-17 21:38:21
【问题描述】:

我有一个抽象超类和几个继承超类中定义的字段的子类,但每个子类对这些字段有不同的值。当调用子类时,我使用构造函数来适当地设置字段。

我应该使用直接引用来做到这一点field = value,还是应该使用超类设置方法setField(value);

我宁愿将字段保密,所以我想避免直接引用。

另一种选择是调用超级构造函数,这将允许我在超级类构造函数super (T value) 和超级类SuperClass(T value){ field = value} 中使用直接引用。这会是最好的方法吗?我什至可以在超级构造函数中使用 set 方法,但这似乎是多余的。

【问题讨论】:

  • 您可能应该重新评估您的类层次结构,看看是否有必要。继承给你带来的问题可能比它解决的要多。子类不应该有很多与超类具有不同值的相同字段。如果你不能使用超抽象类中的任何字段值,你为什么要在那里定义它们?
  • 因为它们对所有子类都是通用的。为什么要多次声明它们?我没有在子类中声明它们。
  • 为什么不在抽象超类中定义字段,但实际上不将它们设置为任何特定值?您应该能够设置抽象超类,如果子类没有为任何字段设置值,则会引发异常。
  • 这就是我正在做的。除了通过子类之外,我从未说过我正在初始化字段。问题是,由于它们是私有字段,它们必须通过超级构造函数访问,或者通过调用公共超级方法。我只是想知道哪种方式最好。

标签: java superclass


【解决方案1】:

使用抽象超类的一大优势和一个重要原因是节省编码时间并使您的类架构更容易。 因此,如果您的超类与子类具有公共字段,那么您应该重新审视您的架构。

要解决您的问题,请删除子类中但已存在于超类中的所有冗余字段。每当您想使用这些字段时,只需使用超类引用即可。例如调用超类构造函数来设置字段的值等。

当你想检索字段时,调用“super.getValue(...)”等

【讨论】:

    【解决方案2】:

    一般来说,您应该将它们设为私有并使用 getter 和 setter 访问它们。如果允许子类直接设置它们,它们可能会通过设置无效值来违反超类的约定。

    如果子类在这些超类字段的值上有所不同,那么您根本不应该使用子类;只需创建具有不同值的超类的实例。

    【讨论】:

    • 如果字段具有您想通过抽象超类强制执行的特定约束,我可以看到您在创建访问器和修改器时的观点。如果不是这样的话,zephos2014 似乎最好只使用受保护的字段并直接访问它们,因为他没有给出他更喜欢私人访问的理由。
    • 老实说,我只是在遵循“最佳实践”。如果受保护的访问阻止不相关的类更改值,那可能会正常工作。
    • 如果字段没有特定的约束,那么超类只是充当子类负责的数据的哑容器。这需要组合,而不是继承。类层次结构应该围绕通用接口设计,而不是通用数据。
    猜你喜欢
    • 2017-04-19
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2023-02-11
    • 2019-04-16
    相关资源
    最近更新 更多