[英]A class with empty methods vs abstract class?
為什么我們不能有一個帶有空方法的普通 class,然后是覆蓋基類的空方法的子類,而不是抽象的 class? 例如:
class Base {
void methodA() {
//empty
}
void methodB() {
//empty
}
}
class Sub extends Base {
void methodA() {
//implementation
}
void methodB() {
//implementation
}
}
我假設您真正要問的是“為什么我們需要抽象類/方法,而我們可以只使用帶有空方法的普通 class ”。
這個問題的答案是使用抽象方法,子 class 必須提供一個實現。 如果方法不在 parent 中,則不是抽象的,則根本不需要 sub 提供實現。
這在方法的空實現沒有意義的情況下很重要,因為編譯器可能會給您一個錯誤,因為您的子 class 沒有實現所有必需的方法。
在您的特定情況下,如果您有 2 個不返回任何內容的方法,則可以執行您正在執行的操作。 這是在null object 模式的邊緣調情,但不完全是。 沒有什么能阻止你這樣做; 它會編譯。 在某些設計中,它甚至可能是一個不錯的選擇。 你的例子太做作了,不能說這是否是一個好主意。
不過,假設您有一個返回值的方法。 你不能只是發表評論//do nothing
因為你需要一個返回來滿足編譯器。 所以你添加了一個哨兵值。 這很容易出錯,因為它依賴於調用者意識到具有特殊含義的值。 如果一組真實結果包含所有可能的值,甚至可能不存在合適的標記值。
class Base {
void methodA() {
//empty
}
int getFoo() {
// Don't do this, just an example
return -1;
}
}
有人可能會實例化new Base()
而沒有意識到他們的代碼注定是無用的,並且該類的作者打算讓他們實例化Sub
或另一個子 class。 他們可能不知道他們應該檢查哨兵值等。
如果他們不能這樣做,在這種情況下會更好。 最好將Base
標記為不完整的實現,並告訴編譯器它必須完成才能使用。 這正是抽象類的用途。
通過將 class 標記為抽象,您告訴編譯器不允許用戶實例化此 class,因為無論出於何種原因,這樣做沒有意義。
通過將方法標記為抽象,您是在告訴編譯器子 class 必須提供實現才能使其自身可實例化(子 class 也可以是抽象的,將罐子踢到子 ZA2F2ED4F8EBC2CBB4C21A29DC40 的實現上)。
abstract class Base {
void methodA() {
//empty
}
abstract int getFoo();
}
TL; DR 你的一個具體例子並不能證明抽象類沒有用處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.