簡體   English   中英

是否可以在Java中鏈接重寫的方法

[英]Is it possible to chain overridden methods in Java

假設我有一個抽象類:

abstract class DBTable {

    abstract boolean append();

}

而且我還有一個從DBTable繼承的子類:

// Client objects are rows of a database table
class Client extends DBTable {

    @Override
    boolean append() {

    }
}

最后,假設我有一個Client的子類,用於表示Client對象的非規范化形式(我覺得這沒關系。它們都在同一包中,並且Client.Expand -is- Client)。

我想做的是重寫Client.Expand中的append()方法,並使其返回到Client中的append()方法,然后再返回僅適用於子類的工作。 像這樣

    // Expand is a member class of Client
    static class Expand extends Client {

        @Override
        boolean append() {
            super.append();
            :
            :
        }
    }

Java允許嗎? 當我嘗試覆蓋在父類中已被覆蓋的方法時,我從IDE中收到錯誤消息。 看來我應該能夠重寫一個重寫的方法以提供子類所需的其他實現,但是也許Java不是為這種繼承構建的?

您的示例有幾個問題:

  1. 當您將類的成員聲明為靜態時,該成員與該類相關聯。 不能與該類的實例一起使用。 例如,當你有一個代碼中展開的附加方法,如- 超級 .append() -即“超”是指一個實例,而不是“下課”。 因此,它與靜態定義相矛盾。 如注釋中所建議,您需要從類聲明中刪除靜態變量。

  2. 子類,不應是內部類,即使允許,也不是一個好的設計。 因為,如果從語義上考慮它,則子類不是超類的成員(在這種情況下,父子詞會產生誤導,因此,超類和子類更好)。 超類不應該知道可以擴展它的類,它應該是獨立的。 因此,最好將子類移至單獨的類。

  3. 您的設計還存在其他一些問題:首先,命名並不能描述主題。 如果client代表一行,那么Row或TableRow ...可能是一個更好的名稱,而ExpendedRow用於下一個類。

但是,更重要的是,擴展表的行並不是一個好主意。 更好的方法可能是讓Row類和Table類組成Row。 像這樣:

// Client objects are rows of a database table
class Row {

    @Override
    boolean append() {

    }
}

class Expanded extends Row{

        @Override
        boolean append() {
            super.append();
            :
            :
        }
    }
class DBTable {

    Row row;

}

我發現了問題。 這讓人很難堪。 在我自己的辯護中,我會'回地回答自己的問題。

我喜歡設計班級,以便班級可以保留主題。 與該主題相關的所有功能,我都想嘗試並放入同一類中。 這對於數據庫數據模型類特別有效,因為對於其他數據庫模型類而言,此類結構通常可以重復。

我到底是什么意思

好吧,這是我的客戶類的“結構”。 如您所見,它包含幾個成員類:

+----------------------------+
|  CLIENT                    |
+---+------------------------+
    |  static EXPAND         |
    +------------------------+
    |  static GHOST          |
    +------------------------+
    |  static BUILDER        |
    +------------------------+
    |  static INQUISITOR     |
    +------------------------+
    |  static QUERYBUILDER   |
    +------------------------+
    |  static JDBCFactory    |
    +------------------------+

我非常喜歡這個設計。 這意味着為我構建Client對象的類可以與Client類位於同一文件中,並且可以使用半助記符“ new Client.Builder()”來調用它,或者可以創建用於構建SQL查詢的對象帶有“ new Client.QueryBuilder()”的客戶端對象。 可以使用“ new Client.JDBCFactory”等實例化其對象成為從JDBC結果集中制作Client對象的工廠的類。我非常喜歡這一類。

缺點是我的牙套很多。

而且...如果我不小心,我可以輸入以錯誤的上下文結尾的內容。 在這種情況下,我要鍵入我希望在EXPAND成員類中的append()方法的定義...實際上只是在括號之外,而是在CLIENT的上下文中鍵入它。

好的,Client已經有一個append()方法,因此IDE向我抱怨說我試圖覆蓋已經具有append()方法的同一類中的方法。

是的,Java完全支持覆蓋鏈接。 我的IDE或JVM沒什么問題,只是我。 再次感謝@Robe和其他人的投入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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