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



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

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

和其他一些性质相似的(getter/setter)

是否有可能在父类主体中定义一个使用子类变量的方法,并避免在子类中使用这些泛型getter和setter ?

这是不可能的,原因很明显:不能保证每个子类实际上都有这个变量,因此不可能引用它,除非达到明显愚蠢的想法,如反射。

然而,如果你觉得这个类的每个子类都有这两个字段,那么,这些字段不应该只是父类的一部分吗?如果你有:

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可以想象它的子类看起来像这样,然后上面看起来很奇怪。如果它的功能本质上与spreadetrowmarker本身捆绑在一起,就把它变成其中的一部分:

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(vs知道它是它的许多子类中的任何一个)。

如果你有25种类型都扩展spreadsheettrowmarker,但你可以想象没有它的子类型,然后考虑制作另一个类"坐在中间"(如果你现在有class F extends A {},制作一个新的abstract class B extends A {},然后用getRow扩展B代替你的25个当前类。把getRow的东西放在b

最新更新