簡體   English   中英

具有檢查異常的覆蓋方法

[英]Overriding method with checked exceptions

我有兩個類,即A和B,其中B擴展了A。我遇到了一個問題,即B引入了附加的功能,該異常帶有異常ExceptionC ,該異常不適用於A的任何形式或形式,但不會t編譯,除非A指定throws ExceptionC 我了解這是設計使然(由於Liskov替換原理)。 我的問題是雙重的:

  1. Liskov替代原則背后的原因是什么? 如果B擴展了A,它是否應該能夠添加更多功能並因此添加例外?
  2. 有什么更好的方法可以做到這一點? 給超類添加一個不適用的異常感覺是錯誤的。

具體情況:

我正在用Java編寫Ultimate Tic-Tac-Toe的實現。 基本上采用井字游戲網格,並用井字游戲網格填充它,如下所示:

 | | # | | # | | 
 | | # | | # | | 
 | | # | | # | | 
#################
 | | # | | # | | 
 | | # | | # | | 
 | | # | | # | | 
#################
 | | # | | # | | 
 | | # | | # | | 
 | | # | | # | |

您從中心開始,並且X進入該網格的任何位置,O進入與較大的網格相對應的網格,因此在兩次移動之后,它看起來可能像這樣:

 | |O# | | # | | 
 | | # | | # | | 
 | | # | | # | | 
#################
 | | #X| | # | | 
 | | # | | # | | 
 | | # | | # | | 
#################
 | | # | | # | | 
 | | # | | # | | 
 | | # | | # | |

如果目標網格已滿或已經贏得,下一個人可以選擇要進入的網格。

我有兩個普通類,兩個異常類和一個接口。

  • TTTBoard實施董事會
  • UltimateTTTBoard擴展了TTTBoard實施板
  • TTTBoard.move引發LocationTakenException
  • UltimateTTTBoard.move引發LocationTakenException,TargetBoardFullException

請注意,在標准井字游戲中,只有一塊板子,因此TargetBoardFullException完全不適用。

我做錯了嗎? 我是否應該為此使用例外?

以下代碼顯示了Java不允許更改合同的原因:

class A {
    public void method() {
        // do something
    }
}

class B extends A {
    public void method() throws IOException {  // <- compile error here
        // do something and throw and exception
    }
}

class App {
    public static void main(String[] args) {
        A a = new B();
        a.method();  // to try or not to try, that's the question now.
    }
}

當然,它不會編譯。 但是如果可以,是否必須在main方法中捕獲IOException(因為它是一個B實例)(不是因為我們在接口上調用該方法)?

暫無
暫無

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

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