在 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 中。
我希望简化我的所有子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 中。