感覺工作了之後沒怎麼用到抽象類 最近在看組內大佬的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)另外,抽象類不能產生對象的,但可以由它的實現類來聲明對象。
在實現接口時,我們也常寫一個抽象類,來實現接口中的某些子類所需的通用方法,接着在編寫各個子類時,即可繼承該抽象類來使用,省去在每個都要實現通用的方法的困擾。