2016-06-13 70 views
2

我對OOP非常陌生並且經歷了與解析器相關的項目代碼。 這包含以下類和接口。擴展實現另一個類的抽象類

public interface Parser { 
    } 

    public abstract class AbstractParser implements Parser{ 
    } 

    public class CSVParser extends AbstractParser{ 
    } 

    public class XMLParser extends AbstractParser{ 
    } 

我不明白爲什麼這樣做?

+0

接口只定義簽名,抽象類可以實現_some_方法。 – Idos

回答

1

它是一個基本的OOP設計,它基本上是一個例子"Program for Interface rather than implementation",更清晰地讀一下關於SOLID設計原則。

現在在這個代碼中,有一個接口,所以如果任何類是一個解析器,那麼它必須實現它,所以再次,如果我們想給每個解析器一些默認行爲,那就是爲什麼有AbstractParser。

要理解此代碼,您必須看到一次Collections的JDK源代碼。 在這裏你會看到,List, Set, Map是接口,那麼你有AbstrictList, AbstractSet, AbstractMap類被定義爲抽象,並有一些方法,如size()的默認實現。然後你有具體的實現,如你可以實例化的ArrayList, HashMap, HashSet。 我會建議你一次通過Collections框架設計,還有SOLID principles

1

接口Parser表示解析器必須提供的合同全部

AbstractParser工具只是合同的一部分,這對於所有的解析器相同的(如果有任何公用部分),並且還可以提供一些保護的方法,可以是執行具體類有用的部分。

CSVParserXMLParser是具體實現。他們使用AbstractParser提供的通用設施履行Parser的合同。

此模式是一種分解公共代碼的方式,因此它只寫入一次並由所有實現共享。具體的類只需要實現其特定需求所特有的代碼。

+0

謝謝!這種模式的名稱是什麼? –

+0

我確定它有一個名字,但自從OOP出現之前(1970年代),我一直在使用它。我敢肯定有人會用「官方」的名字加入。我只是稱之爲「分解通用代碼」。 –

+0

它基本上是「接口而不是實現的程序」,請看我的回答,希望它可以在一定程度上幫助你。 – pbajpai21

0

接口解析器可用於聲明方法,如解析其返回類型和輸入參數。

像CSVParser和XMLParser這樣的實現類將使用覆蓋典型面向對象行爲的方法來定義方法的主體。

抽象類介於兩者之間以引入解析器所需的任何狀態,如:FileHandle,LogHandle。