[技术学习]js接口继承
生活随笔
收集整理的這篇文章主要介紹了
[技术学习]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接口继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DOS界面的个性化定制
- 下一篇: 矩阵理论 第十三讲 Penrose 广义