簡體   English   中英

摘要 class 延伸具體 class

[英]Abstract class extends concrete class

我之前了解到abstract class可以extend concrete class。雖然我沒有從JAVA的設計者那里看到原因,但是沒關系。 我還了解到擴展具體 class 的抽象 class 可以使重寫方法抽象。 為什么? 你能提供有用的用例嗎? 我正在嘗試學習設計模式,我不想錯過任何東西。

這是例子:

public class Foo 
{
    public void test()
    {
    }
}

public abstract class Bar extends Foo
{
   @Override
   public abstract void test();
}

如果我有一組我想要test()的默認實現(因此它們可以從Foo擴展),以及我想強制提供它們自己的實現的那些類的子集(在這種情況下),這就變得很有用在子類中將它抽象化會強制執行此操作。)

當然,這個例子中的替代方法是在頂級類而不是子類中聲明test()抽象,這就是你通常所做的 - 但是有些情況下滿足is-a繼承關系意味着從設計的角度來看它偶爾會更有意義。 這種情況很少見,但有時你會看到它。

順便說一下,雖然是一個特例,但請記住,除非另有說明,否則所有類都會隱式擴展Object 因此,如果你包含這個案例,那么擴展具體類的抽象類畢竟不是那么不尋常!

它基本上是有選擇地重用一些現有的(遺留?)代碼。

例如 :假設有人已經創建了一個具體的類C (當然是完整的實現)。

現在,既然你正在設計一個新的系統(它有一個抽象的類A ),你分析了現有的系統,發現你將會有一些方法幾乎類似於具體的C類方法。 但是您還發現具體類C的某些方法過於具體,您希望在抽象類A的具體子類中強制執行這些方法。

因此,它使您可以選擇性地選擇要重用的方法和不重用的方法。

使類擴展您的類(使其成為抽象)以提供特定類型的實現。

例如:

  • 抽象的ClassA
  • ClassB擴展了ClassB - 提供了ClassA中定義的抽象方法的特定實現

如果您將test方法設為抽象,則會強制從Bar類派生的任何人提供該方法的實現。

如果您從該抽象方法Bar類,那么任何人獲得Bar不必執行test方法, Foo已經提供了一個(空)的實現。

當系統發展並且我們不想干擾現有代碼時,這種靈活性特別有用。

我能想到的一個簡單例子是考慮一個MSDocReader類。 此類是遺留系統的一部分,許多其他應用程序依賴於此。

現在需求發生了變化。 我們必須編寫用於讀取docx文件,ppt甚至xsl文件的類。

MSDocReader類包含可以重用的方法,例如以KB為單位獲取文件的大小,連接到.Net框架(如果我沒錯:-))

現在使用這個規定,我們可以編寫一個absract類AbstractMSFileReader ,它將包含MSDocReader中使用的所有方法。 但是這個類將read方法作為抽象。

我們之所以要強迫開發人員使用自己版本的read方法。 (我們不應該使用繼承,因為繼承明確指出子類方法將擴展父方法的功能。讀取doc文件和讀取excel文件是兩個不同的東西,它們不屬於同一層次結構。)

你可能會爭辯說我們可以創建一個抽象類並使MSDocReader類擴展該抽象類。 但是可能會發生MSDocReader類可能正在擴展其他類,因為java不支持多繼承。它可能會產生問題

Object Class 是 class 層次結構的根。

  • 每個類(抽象 class 以及)都有 Object 作為超類。 包括arrays在內的所有對象都實現了這個class的方法。

暫無
暫無

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

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