簡體   English   中英

具有空方法的 class 與抽象 class?

[英]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.

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