![](/img/trans.png)
[英]Return a class, not an instance, of a concrete class that extends an abstract base 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的具體子類中強制執行這些方法。
因此,它使您可以選擇性地選擇要重用的方法和不重用的方法。
使類擴展您的類(使其成為抽象)以提供特定類型的實現。
例如:
如果您將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 層次結構的根。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.