簡體   English   中英

在繼承的類上重寫類變量/方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM