(18):接口優先於抽象類

因爲java只允許單繼承,所以抽象類受到了極大的限制。但是接口一點定義,被其他類廣泛應用時,其擴張就變得很困難。而抽象類的演變比接口的演變容易得多。

骨架通過對導出的每個重要接口都提供一個抽象的骨架實現類,把接口和抽象類的優點結合起來 。接口的作用仍然是定義類型,但是骨架實現類接管了所有域接口實現相關的工作 。

static List<Integer> intArrayAsList(final int[] a){
        if(a == null)
            throw new NullPointerException();
        return new AbstractList<Integer>() {
            public Integer get(int i){
                //自動裝箱
                return a[i];
            }
            public Integer set(int i,int val){
                int oldval = a[i];
                //自動拆箱
                a[i] = val;
                自動裝箱
                return oldval;
            }
            public int size(){
                return a.length;
            }
        };
    }
通過對Java源碼的學習我們會發現,AbstractCollection實現了Collection接口,List接口繼承自Collection接口,AbstractList又繼承了AbstractCollection類,並且實現了List接口。
諸如此種的還有AbstarctSet,AbstarctList,AbstarctMap,都是繼承了一個抽象類,又實現了一個上層接口。這樣做的好處:通過對你導出的每個重要接口都提供一個抽象的骨架實現類(skeletal implementation)類,把接口和抽象類的優點結合起來。接口的作用仍然是定義類型,但是骨架實現類接管了所有與接口實現相關的工作。

骨架實現方法:

首先是,接口定義了功能性的方法; 
然後,一個抽象類實現了這個接口,作爲骨架實現類,它完成了接口的一部分實現(默認實現) 
最後是一個普通類,繼承自這個抽象的骨架實現類,並完成了抽象類中未實現的方法。

發佈了50 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章