我的理解是,在 Java 中,使用靜態變數繼承父類意味著靜態變數將簡單地在父類和子類之間共享,而試圖“覆寫”靜態變數只會導致隱藏它們。
我已經在我的專案中定義了 A 類,其函式使用 A 類中定義的靜態變數。我想創建一個非常相似的類——B 類——這樣它就具有相同的功能(無需復制將函式的代碼復制粘貼到 B 類檔案中),但讓函式使用 B 類中定義的靜態變數。
如果我只是在擴展 A 類后嘗試“覆寫”靜態變數,那么由于“隱藏”,這些函式(即使通過 B 類的實體呼叫)仍然會在 A 類(而不是 B 類)中使用靜態變數。有沒有辦法不復制函式的代碼并共享邏輯(參考靜態變數)但不知何故仍然滿足以下要求?
- 繼續使用靜態變數
- 不要為靜態變數添加/強制使用 getter 方法,因為強制使用 getter 方法意味著將來對代碼的更改需要記住必須使用 getter 方法而不是直接使用變數。例如,如果我們以這種方式實作它,然后有人添加了一個
newFunction()直接使用靜態變數的新函式(例如)(而不是使用 getter 方法),那么 B 類現在將使用 A 類的靜態變數(因為未使用)何時newFunction()為 B 類呼叫。
public class A {
public static String CONSTANT_1 = "Some information";
public static String CONSTANT_2 = "More information";
public static String CONSTANT_3 = "Something Something";
public static String CONSTANT_4 = "More stuff, more stuff";
public void doSomething() {
// do something with CONSTANT_1
}
public void doSomething2() {
// do something with CONSTANT_2
}
public void doSomething3() {
// do something with CONSTANT_3
}
// ...
}
public class B extends A {
public static String CONSTANT_1 = "abc";
public static String CONSTANT_2 = "def";
public static String CONSTANT_3 = "ghi";
public static String CONSTANT_4 = "jkl";
// don't want to repeat all the logic in the functions in class A,
// want to somehow inherit or share code for functions between classes A and B,
// but have different static variables being used in the functions
}
到目前為止我考慮過但還不完全滿意的內容:
轉換為 Kotlin(不確定繼承的效果如何,將靜態替換為伴隨物件)
如帖子中所述使用getter方法
Using non-static instead of static (trying to see if we can keep the variables static)
uj5u.com熱心網友回復:
如果要保持變數靜態,可以使類 A 中的方法接受變數作為引數。
要在不創建類的物件的情況下使用方法,也要使方法成為靜態的。
public static void doSomething(String one) {
// do something with CONSTANT_1
System.out.println(one);
}
您可以使用以下相同的方法,
A.doSomething(A.CONSTANT_1);
A.doSomething(B.CONSTANT_1);
uj5u.com熱心網友回復:
我會將成員變數和方法定義為抽象類的非靜態成員。然后在 A 中公開抽象類的單例實體,您可以像這樣使用它:
A.getInstance().doSomething();
然后在 B 中,您可以公開抽象類的子類的單例實體。
在 Kotlin 中,這可能看起來更干凈一些。您可以使 A 和 B 每個都object擴展相同的抽象類。或者,如果 A 或 B 也是常規類,則改為為它們提供擴展抽象類的伴生物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453138.html
標籤:java kotlin inheritance static
上一篇:如何在C 中呼叫基類方法?
