[英]Why EnumSet is implemented as abstract class and EnumMap is implemented as concrete 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.