貫徹super
一個獨立的變體,打破虛擬方法分派將是一個非常糟糕的想法。
讓我們想想了一會兒。
abstract class Base {
abstract String Description();
String toString() { return "Base"; }
}
class Derived extends Base {
String Description() { return "Derived description"; }
String toString() { return "Derived"; }
static void use(Base instance) {
System.out.println(instance.toString());
System.out.println(instance.Description());
}
}
現在,讓我們把你的建議,並假設super
是有效的,不會有什麼建議;那麼我們可以在Derived
寫:
class Derived extends Base {
// Previous declarations omitted.
void useSuper() { Derived.use(super); }
void useThis() { Derived.use(this); }
static void main() {
Derived instance = new Derived();
instance.useThis();
instance.useSuper();
}
}
現在,如果我理解你,你建議的主要功能應該按順序打印:
- 的
toString()
從Derived
實現:「派生」。
- 的
Description()
從Derived
實現: 「基地」: 「派生的描述」
- 的
toString()
從Base
實施。
- 執行
Description()
從Base
:它不存在。而我能想到的兩種解決方案會導致更大的問題:
- 引發異常:恭喜,您現在可以打破任何依賴抽象方法實際實施而不考慮它的程序。 (你怎麼知道函數會調用抽象方法?)
- 從
Derived
返回實現:中斷一致性。
總之,這樣的使用詞語super
的概念性分解面向對象的編程。
它是如何失敗?這是一個編譯錯誤?運行時異常?或意外的行爲? (例如'System.out.println(super)'輸出與'this.toString()'相同的東西) –
問題是編譯錯誤發生在使用'super'的第二種情況。錯誤訊息是「'。'預期「,它看起來像一個語法錯誤。 – JaycePark
*「這是一個簡單的問題。」*請注意「生命的意義是什麼?」是一個簡單的問題。這是更難的答案。 ;) –