我希望簡化一些在我的所有子類中共享的方法,在這種情況下有 25 。我目前使用一個介面來實作
public int getRow() {
return row;
}
public boolean getCondition() {
return condition;
}
還有一些性質相似的(getter/setter)
是否可以在父類主體中定義一個使用子類變數的方法,并避免在子類中使用這些通用的 getter 和 setter?
uj5u.com熱心網友回復:
這是不可能的,原因很明顯:不能保證每個子類實際上都有那個變數,因此如果沒有達到諸如反射之類的明顯愚蠢的想法,就不可能參考它。
但是,如果你覺得這個類的每個子類真的會有這兩個欄位,那么,這些欄位不應該只是父類的一部分嗎?如果你有:
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試圖代表它的所有可以想象的子類看起來都像這樣的東西的本質中是根深蒂固的,那么上面的內容似乎很奇怪。如果它的功能本質上與 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(VS知道這是它的許多子類中的任何一個)。
如果您有 25 種型別都擴展了 SpreadsheetRowMarker,但您可以想象沒有它的子型別,那么請考慮創建另一個類以“介于兩者之間”(如果您class F extends A {}現在有,則創建一個新類abstract class B extends A {},然后將 25 個當前類與getRow改為擴展 B。把getRow東西放在 B 中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/340722.html
下一篇:避免不必要的類宣告
