我有两个类,A和B,其中B扩展A.我遇到了一个问题,其中B引入了一个附加功能,该异常ExceptionC
附带的任何形式或形式都不适用到A,但它不会编译,除非A指定它throws ExceptionC
。我知道这是设计的(因为Liskov替代原则)。我的问题有两个:
具体情况:
我正在用Java编写Ultimate Tic-Tac-Toe的实现。基本上采用井字游戏网格并用井字游戏网格填充,如下所示:
| | # | | # | |
| | # | | # | |
| | # | | # | |
#################
| | # | | # | |
| | # | | # | |
| | # | | # | |
#################
| | # | | # | |
| | # | | # | |
| | # | | # | |
你从中心开始,无论X进入那个网格,O都会进入与较大网格相对应的网格,所以在两次移动后它可能看起来像这样:
| |O# | | # | |
| | # | | # | |
| | # | | # | |
#################
| | #X| | # | |
| | # | | # | |
| | # | | # | |
#################
| | # | | # | |
| | # | | # | |
| | # | | # | |
如果目标网格已满或已经获胜,下一个人可以选择进入哪个网格。
我有两个普通的类,两个异常类和一个接口。
请注意,在标准的tic-tac-toe中,只有一个板,因此TargetBoardFullException完全不适用。
我这样做错了吗?我不应该为此使用例外吗?
答案 0 :(得分:1)
以下代码说明了Java不允许更改合同的原因:
var pattern = /([A-Z][^\.!?]*[\.!?])/ig;
var match;
while ((match = pattern.exec(surroundingTextStr)) != null){
// How can I check that this sentence currently holds the cursor?
}
当然,它没有编译。但是如果它会,我们是否必须在main方法中捕获IOException(因为它是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.
}
}
实例)或不是(因为我们在接口上调用该方法)?