簡體   English   中英

為什么抽象方法必須由第一個具體的 class 來實現,而不是再往下走?

[英]Why do abstract methods have to be implemented by the first concrete class, and not one further down the chain?

我很好奇為什么抽象方法必須被第一個具體實現 class 覆蓋,而不是在層次結構更改的更下方。

我並不是說我想這樣做,但我很好奇為什么它必須是第一個 class

考慮這個例子

abstract class Upper
{
    abstract void doSomething();
}

class Middle extends Upper
{
    void doSomething()
    {
       // I'm forced to be implemented here
    }
}

abstract class Lower extends Middle
{

}

class Bottom extends Lower
{
    void doSomething()
    {
        // I'm valid, but I'm too far down the hierarchy
    }
}

根據定義,普通的 class 必須實現所有抽象方法。 如果您要聲明 Middle 抽象,那么您將不必在 Middle 中實現方法。

可以實例化普通的 class,而抽象的 class 不能。 想想如果你嘗試調用 class 中沒有實現的方法會發生什么。

具體的類是具體的。
這意味着它們應該能夠被初始化和使用。
那么,如果你不實現這些方法,如何正確使用它呢? 這將是不完整的,因此不具體。

您可以讓另一個抽象 class 繼承一個抽象 class。

只需將Middle設為抽象 class,就可以了。

如果您想將Middle保留為具體的 class 但還要從中刪除doSomething ,請說明您希望此代碼做什么:

Upper x = new Middle();
x.doSomething();

如果 Middle 是具體的 class,則沒有定義抽象方法的實例化版本將無法調用(因為它沒有定義)。 這本質上也會使 Middle 成為抽象的 class 。

因為在非抽象的 class 中不能有抽象方法。 如果您不需要任何方法,則不需要擴展該 class。

相反,只需讓class Lower extend Upper

如果您仍然希望Lower繼承抽象方法和繼承Middle ,只需將Middle聲明為抽象。

你不得不在Middle中實現doSomething ,因為 Middle 是一個具體的 class。 這意味着Middle必須提供來自其超類的所有抽象方法的實現,以及來自它實現的接口的任何接口方法的實現。

如果將Middle標記為抽象 class,則可以將doSomething的實現委托給Bottom

有關抽象類的更多信息,請參閱Java 語言規范中的此鏈接。

在您的示例中,如果沒有在 Middle 中聲明 doSomething,則不會運行任何代碼。 因此 class 必須是抽象的。

這實際上不是must的問題。 抽象的 class 只是一個 class 具有一個或多個方法而沒有實現。

這更像是說一個生物學上的人類男性必須有一條 Y 染色體。 這不是法律; 它只是定義的一部分。

在您的示例中,如果您不想在Middle實現doSomething ,那么您真的不希望Middle變得具體 也就是說,它將有一個沒有定義的方法。 所以很抽象。

當然,您可以將它實現為一個什么都不做的空 function。 我相信這與您要問的非常接近。

真的,這只是術語的問題。 如果有未實現的成員,則為類型的抽象。 就是這么簡單。

暫無
暫無

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

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