[Thinking in java] _爲什麼要使用抽象類

感覺工作了之後沒怎麼用到抽象類 最近在看組內大佬的code的時候 發現很多抽象類的使用,所以去百度了一把:使用抽象類到底有哪些好處

=>  code by  信哥   轉載註明出處 

/**
 * @author diego
 * @time 2019-02-26 11:29
 * @description
 */
public abstract class AbstractInstruct implements Instruct<ChainDataObject, ResultDTO, Instruction> {

    @Autowired
    private CommonInstructInterpreter commonInstructInterpreter;
    @Autowired
    private CommonInstructInvoker commonInstructInvoker;

    protected abstract List<Field> buildField(InstructContext instructContext);

    protected abstract Table buildTable(InstructContext instructContext);

    protected abstract List<OpsField> buildFilter(InstructContext instructContext);

    protected abstract List<AggField> buildAggregation(InstructContext instructContext);

    protected abstract List<OpsField> buildAggFilter(InstructContext instructContext);

    protected abstract List<Sort> buildSort(InstructContext instructContext);


    @Override
    public Instruction instruction(ChainDataObject chainDataObject) {

    }

    @Override
    public ResultDTO invoke(ChainDataObject chainDataObject) {

    }

}
/**
 * @author diego
 * @time 2019-02-28 11:15
 * @description
 */
public class BaseInstruct extends AbstractInstruct {

    @Override
    protected List<Field> buildField(InstructContext instructContext) {

        ChainDataObject chainDataObject = instructContext.getChainDataObject();
        List<Field> fields = chainDataObject.getCols();
        return fields;
    }

    @Override
    protected Table buildTable(InstructContext instructContext) {
        return null;
    }

    @Override
    protected List<OpsField> buildFilter(InstructContext instructContext) {

        ChainDataObject chainDataObject = instructContext.getChainDataObject();
        List<OpsField> opsFields = chainDataObject.getFilter();
        return opsFields;
    }

    @Override
    protected List<AggField> buildAggregation(InstructContext instructContext) {

        List<AggField> aggFields = instructContext.getChainDataObject().getAggregation();
        return aggFields;

    }

    @Override
    protected List<OpsField> buildAggFilter(InstructContext instructContext) {
        return null;
    }

    @Override
    protected List<Sort> buildSort(InstructContext instructContext) {
        List<Sort> sorts = instructContext.getChainDataObject().getSort();
        return sorts;

    }
}

by https://blog.csdn.net/pianistofsoftware/article/details/51910605

抽象類與接口緊密相關。然接口又比抽象類更抽象,這主要體現在它們的差別上:1)類可以實現無限個接口,但僅能從一個抽象(或任何其他類型)類繼承,從抽象類派生的類仍可實現接口,從而得出接口是用來解決多重繼承問題的。2)抽象類當中可以存在非抽象的方法,可接口不能且它裏面的方法只是一個聲明必須用public來修飾沒有具體實現的方法。3)抽象類中的成員變量可以被不同的修飾符來修飾,可接口中的成員變量默認的都是靜態常量(static final)。4)這一點也是最重要的一點本質的一點"抽象類是對象的抽象,然接口是一種行爲規範"。

不同之處:
定義// 
  抽象類表示該類中可能已經有一些方法的具體定義,但是接口就僅僅只能定義各個方法的界面(方法名,參數列表,返回類型),並不關心具體細節。
用法//
  1)在繼承抽象類時,必須覆蓋該類中的每一個抽象方法,而每個已實現的方法必須和抽象類中指定的方法一樣,接收相同數目和類型的參數,具有同樣的返回值,這一點與接口相同。
  2)當父類已有實際功能的方法時,該方法在子類中可以不必實現,直接引用的方法,子類也可以重寫該父類的方法(繼承的概念)。
  3)而實現 (implement)一個接口(interface)的時候,是一定要實現接口中所定義的所有方法,而不可遺漏任何一個。
  4)另外,抽象類不能產生對象的,但可以由它的實現類來聲明對象。
 

在實現接口時,我們也常寫一個抽象類,來實現接口中的某些子類所需的通用方法,接着在編寫各個子類時,即可繼承該抽象類來使用,省去在每個都要實現通用的方法的困擾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章