日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

[技术学习]js接口继承

發布時間:2024/1/4 综合教程 24 生活家
生活随笔 收集整理的這篇文章主要介紹了 [技术学习]js接口继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

js是面向對象語言,但是js又缺乏了面向對象的諸多特性,比如繼承,沒有接口繼承也沒有父類繼承,因此有時候需要人工來實現繼承。

一、首先看下java中面向對象的繼承:

//定義類鳥類的飛行動作
interface BirdFlyable {
    public void fly();
}
//鳥類
class Bird implements BirdFlyable{
    public void fly(){
        System.out.println("bird is flying");
    }
}
//蝙蝠同樣可以飛行,不過沒有繼承鳥類的動作
class Bianfu{
    public void fly(){
        System.out.println("Bianfu is flying");
    }
}

public class Test{
    //定義fly方法,要求傳入鳥類飛行方法
    public void fly(BirdFlyable flyable){
        flyable.fly()
    }
    public static void main(String[] args) {
        Bird bird=new Bird();
        fly(bird);//bird is flying
        //Bianfu bianfu=new Bianfu();
        //fly(bianfu) //執行蝙蝠方法,報錯
    }
}

此處可以看到fly(bird)執行結果為bird is flying,如果Bird繼承了BirdFlyable卻沒有實現fly方法,會在編譯時候報錯,相反,如果使用fly(bianfu),因為蝙蝠沒有繼承接口,同樣也會報錯,因此java中的接口繼承為嚴格的繼承。

二、python繼承

#定義鳥類飛行方法
class BirdFlyable():
    def fly(self):
        pass
#定義鳥類
class Bird(BirdFlyable):
    def fly(self):
        print('bird is flying')

#定義蝙蝠
class Bianfu():
    def fly(self):
        print('Bianfu is flying')

#增加方法,希望傳入鳥類飛行方法
def fly1(birdFlyable):
    birdFlyable.fly();

#事實證明,傳入蝙蝠也是可以的
fly1(Bird())#bird is flying
fly1(Bianfu())#bird is flying
        

在python中因為方法中的參數沒有明確規定類型,因此只要執行時候含有此方法,即可完成功能。

這就是動態語言的“鴨子類型”,它并不要求嚴格的繼承體系,一個對象只要“看起來像鴨子,走起路來像鴨子”,那它就可以被看做是鴨子。

三、js中實現接口

目前js中實現接口有三種方法:

1、文檔注釋,即預先在文檔注釋中寫好接口,規定接口中的方法,開發人員根據注釋編寫接口,此方法其實用處不大,無法強制開發人員繼承接口。

2、屬性檢測法:在定義類的時候,規定類繼承了哪幾個接口,此方法只能檢測接口名稱,不能檢測具體實現方法。

3、鴨式辯型法:與python中一樣,來源與“看起來像鴨子,走起路來像鴨子”,那它就可以被看做是鴨子的理論,重點關注類實現了哪些方法,而忽略繼承了那個接口,從而判斷類的繼承,實現方法如下:

    //鴨式辯型法  實現javascript接口最完美的方法
    //核心方法是檢測是否實現了接口的每一個方法
    //面向對象,代碼實現統一,也解耦了

    //1、接口類
    /**
    *接口需要兩個參數,1、名字,2、抽象方法名稱數組
    */
    var Interface=function(name,methods){
        //如果參數大于一個,且第二個參數為數組,否則拋出異常
        if(arguments.length>=2&&(arguments[1] instanceof Array)){           
            this.name=name;
            this.methods=[];
            for(var index in methods){
                if(typeof methods[index]=='string'){
                    this.methods.push(methods[index]);
                }else{
                    throw new Error('方法名應該是字符串')
                }
            }
        }else{
            throw new Error("接口需要兩個參數,1、名字,2、抽象方法名稱數組");
        }
    }

    //定義兩個接口,分別為增刪改查
    var interface1=new Interface('interface1',['add','delete']);
    var interface2=new Interface('interface2',['modify','query']);

    /**
    *定義接口檢驗類,主要檢驗是否實現了接口中的所有方法
    *接口中傳遞參數為:1、需要檢測的類,2、其他接口參數
    */
    Interface.checkInterface=function(object){
        if(arguments.length>=2){
            for(var i=1,len=arguments.length;i<len;i++){
                //獲取需要檢測的接口
                var interface=arguments[i];
                //獲取接口中所含的所有方法
                for(var j=0,methods=interface.methods;j<methods.length;j++){
                    var method=methods[j];
                    if(!object[method]||(typeof object[method]!='function')){
                        throw new Error("方法"+method+"沒有實現");
                    }

                }
            }
        }else{
            throw new Error('接口檢驗錯誤,參數至少兩位')
        }
    }

    //定義From類
    //實現接口1和接口2中的方法
    function Form(){
        this.add=function(){
            alert('add');
        };
        this.delete=function(){
            alert('delete')
        };
        this.modify=function(){
            alert('modify')
        };
        this.query=function(){
            alert('query')
        }
    }
    //實例化類
    var form =new Form();
    //做借口檢查
    Interface.checkInterface(form,interface1,interface2)
    form.add();

總結

以上是生活随笔為你收集整理的[技术学习]js接口继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。