在 Java 中,我可以让父 class 实现一个使用子 class 中的变量的方法吗?

In Java, can I have a parent class implement a method that uses a variable from a subclass?

我希望简化我的所有子classes 共享的一些方法,在这种情况下有 25 个以上。我目前使用一个接口来实现

public int getRow() {
    return row;
}
public boolean getCondition() {
    return condition;
}

还有一些性质相似的 (getters/setters)

是否可以在父 class 主体中定义一个使用子 class 变量的方法,并避免在子 class 中使用这些通用的 getter 和 setter?

这是不可能的,原因很明显:不能保证 every subclass 实际上有那个变量,因此不可能引用它缺乏明显愚蠢的想法,例如反思。

但是,如果你觉得这个 class 的每个子 class 真的会有这两个字段,那么,这些字段不应该只是父 class 的一部分吗?反而?如果你有:

public abstract class SpreadsheetRowMarker {}

public final class InvoiceRowMarker extends SpreadsheetRowMarker {
  private final int row;

  public InvoiceRowMarker(int row) {
    this.row = row;
  }

  public int getRow() {
    return row;
  }
}

// another 24 classes a lot like InvoiceRowMarker

不仅如此,它还有效地根植于 SpreadsheetRowMarker 试图代表 ALL 可想象子 classes 的任何事物的本质它看起来像那样,然后上面看起来很奇怪。如果它的功能本质上与 SpreadsheetRowMarker 本身捆绑在一起,那么就让它成为其中的一部分:

public abstract class SpreadsheetRowMarker {
  private final int row;

  public SpreadsheetRowMarker(int row) {
    this.row = row;
  }

  public int getRow() {
    return row;
  }
}

public final class InvoiceRowMarker extends SpreadsheetRowMarker {
  public InvoiceRowMarker(int row) {
    super(row);
  }
}

// and 24 more such classes

不幸的是,您无法摆脱这些构造函数,但大概您已经有 24 个接受 row 变量的构造函数。上面的意思是 getRow() 现在居中放置, 你现在可以在任何东西上调用它,只要你知道它是 SpreadsheetRowMarker(相对于知道它是任何它的众多子classes之一)。

如果您有 25 种类型都扩展了 SpreadsheetRowMarker 但您可以想象没有它的子类型,那么请考虑制作另一个 class 到 'sit in between'(如果您有 class F extends A {}现在,创建一个新的 abstract class B extends A {},然后让你的 25 个当前的 classes 和 getRow 扩展 B。把 getRow 的东西放在 B 中。