java中抽象类继承抽象类_用Java中的抽象类扩展抽象类
java中抽象類繼承抽象類
示例問題
當我創建Java :: Geci抽象類AbstractFieldsGenerator和AbstractFilteredFieldsGenerator我遇到了一個不太復雜的設計問題。 我想強調一下,這個問題和設計對于某些人來說似乎很明顯,但是在我最近與一位初級開發人員(我的兒子Mihály的交談)中,我的文章比我的英語要好得多,意識到這個話題可能仍然有價值。
無論如何。 我有這兩個類,字段和過濾字段生成器。 第二堂課擴展了第一堂課
abstract class AbstractFilteredFieldsGenerator extends AbstractFieldsGenerator {...添加額外的功能,同時應為具體實現提供相同的簽名。 這是什么意思?
這些生成器使用反射幫助生成特定類的代碼。 因此,他們處理的輸入信息是Class對象。 字段生成器類具有一個抽象方法process() ,該方法將為每個字段調用。 它是從實現的方法中調用的,該方法遍歷字段并分別對每個字段進行調用。 當具體類extends AbstractFieldsGenerator并由此實現此抽象方法時,它將被調用。 當更改相同的具體類以使其extends AbstractFilteredFieldsGenerator ,將僅為過濾的方法調用具體方法。 我想要一個設計,以便在具體課程中唯一需要更改的是更改名稱。
問題定義 類
以更抽象的方式描述相同的問題:有兩個抽象類A和F以便F extends A和F提供一些額外的功能。 兩者都聲明了具體類應實現的抽象方法m() 。 當具體的類C聲明從C extends A到C extends F到C extends F時,方法m()的調用應更改,但類C不應進行其他更改。 從類A定義的方法p()調用方法m() 。 如何設計F ?
這是什么問題?
可以通過兩種明顯不同的方式來擴展A :
- F覆蓋m()使它混凝土在實施額外的功能m()并調用新的抽象方法,說mx()
- F使用提供額外功能的版本覆蓋方法p() (在上面的示例中進行過濾),并調用仍然抽象的方法m()
第一種方法不能滿足由具體類C實施的簽名應保持相同的要求。 第二種方法將A的已經實現的功能扔給垃圾并以不同的方式重新實現它。 實際上,這是可能的,但是肯定會進行一些復制/粘貼編程。 這是有問題的,讓我不解釋原因。
問題的根源
在工程中,當我們面對這樣的問題時,通常意味著問題或結構沒有得到很好的描述,解決方案位于完全不同的區域中。 換句話說,有些假設驅動我們的思維方式是錯誤的。 在這種情況下,問題在于我們假設抽象類提供了一個擴展“ API”來對其進行擴展。 請注意,API不僅可以調用。 對于抽象類,擴展該抽象類時要實現的API。 正如庫可以為使用不同的方式提供不同的API(Java 9 HTTP客戶端可以send()以及sendAsync() )一樣,抽象(實際上也是非抽象的)類也可以提供不同的擴展方式。用于不同的目的。
如果不修改A就無法編碼F達到我們的設計目標。 我們需要一個A版本,該版本提供不同的API來創建具體的實現,并提供另一個(不一定是正交/正交)來創建靜態抽象的擴展。
在這種情況下,API之間的區別在于,具體實現的目標是在調用鏈的末尾,而抽象擴展則希望鉤在調用鏈的最后一個元素上。 A的實現必須提供要掛接到調用鏈的最后一個元素上的API。 這已經是解決方案。
解
我們在類F實現方法ma() ,我們希望p()調用我們的ma()而不是直接調用m() 。 修改A我們可以做到。 我們在A定義ma() ,然后從p()調用ma() p() 。 在A實現的ma()版本應毫不費力地調用m() ,以為A具體實現提供原始的“ API”。 F中ma()的實現包含額外的功能(在示例中為過濾),然后調用m() 。 這樣,任何具體的類都可以擴展A或F并可以使用完全相同的簽名實現m() 。 除了調用m()是與ma()的兩個版本相同的代碼外,我們還避免了復制/粘貼編碼。
如果我們希望類F具有更多抽象類可擴展性,則F::ma實現不應直接調用m() ,而應調用m()的新mf() m() 。 這樣,新的抽象類可以覆蓋mf()從而再次提供新功能并調用抽象m() 。
帶走
- 在https://github.com/verhas/abstractchain中找到示例演示應用程序
- 在https://github.com/verhas/javageci上找到具有這種模式的原始的,有點復雜的應用程序
翻譯自: https://www.javacodegeeks.com/2019/06/extending-abstract-classes-with-abstract-classes-in-java.html
java中抽象類繼承抽象類
總結
以上是生活随笔為你收集整理的java中抽象类继承抽象类_用Java中的抽象类扩展抽象类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么修改qq绑定邮箱(怎么修改qq绑定邮
- 下一篇: iis怎么新建ftp站点(iis创建ft