[英]Override class variable/method on inherited classes
我已經定義了一個類,並且希望有一個類方法(或變量,我不在乎),每個繼承的類都需要重寫該方法。 我最好的方法是不成功的:
public abstract String getHumanString();
,因為抽象方法不能是靜態的
public static String getHumanString();
,因為靜態方法只能被隱藏,不能被覆蓋。
我不知道我是否可以使用其他技巧。 我也可以高興地自動在父類上通過諸如getHumanString()
class.getClass().getName()
)之類的方法自動定義getHumanString()
getName()
根據我的需要,我會讓getName()
看起來更漂亮) , getName()
在靜態方法上不可訪問。 因此,總而言之,我的問題是:
1.我可以有一個可以在子類上進行編輯的靜態方法/變量嗎?
或者,作為另一個有效的解決方案:
2.我可以創建一個使用自己的類名播放的靜態方法嗎?
提前致謝。
編輯:
想象一下這種情況(我將在此處直接編寫代碼,所以我將跳過無用的行):
class ParentClass {
public static (or whatever) String getHumanString() {
return "My Parent Class";
}
public static showMyInfo() {
System.out.println(getHumanString());
}
}
class ChildClass {
@Override
public static (or whatever) String getHumanString() {
return "My Child Class";
}
}
...
public static void main()
{
ChildClass.showMyInfo();
}
它應該輸出(如我所願)“我的孩子班”,但實際上卻輸出(眾所周知)“我的父母班”。
靜態方法不是多態的,不是。 順便說一句,變量也不是-您不能覆蓋變量,甚至不能覆蓋實例變量。 您可以隱藏它們,但不能覆蓋它們。
坦白說,您實際上並不清楚要做什么,但是您可能需要考慮一個對應的類型層次結構,以便靜態方法成為新類型中的實例方法。
我希望每個類都有一個可讀的名稱(不僅僅是getClass()。getName()),它不依賴於對象實例。 實際上,當我需要getHumanString()時,我想避免實例化該類。
有一個屬性文件,其類名為鍵,人為字符串為值。 還有一個靜態方法可以在某處讀取它。
static String getHumanString(Class<?> clazz){
return humanStrings.getProperty(clazz.getName(), clazz.getSimpleName());
}
必要時還可以進行本地化。 另外,您可以“增強”您無法更改其定義的現有類。
如果有此要求,我建議將static
成員和字段拆分為自己的類。 這樣,您現有的類可以引用一個多態類的單個static
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.