Java中继承的接口报错,[技术学习]js接口继承

js是面向对象语言,但是js又缺乏了面向对象的诸多特性,比如继承,没有接口继承也没有父类继承,因此有时候需要人工来实现继承。

一、首先看下java中面向对象的继承:

//定义类鸟类的飞行动作

interfaceBirdFlyable {public voidfly();

}//鸟类

class Bird implementsBirdFlyable{public voidfly(){

System.out.println("bird is flying");

}

}//蝙蝠同样可以飞行,不过没有继承鸟类的动作

classBianfu{public voidfly(){

System.out.println("Bianfu is flying");

}

}public classTest{//定义fly方法,要求传入鸟类飞行方法

public voidfly(BirdFlyable flyable){

flyable.fly()

}public static voidmain(String[] args) {

Bird bird=newBird();

fly(bird);//bird is flying//Bianfu bianfu=new Bianfu();

//fly(bianfu) //执行蝙蝠方法,报错

}

}

此处可以看到fly(bird)执行结果为bird is flying,如果Bird继承了BirdFlyable却没有实现fly方法,会在编译时候报错,相反,如果使用fly(bianfu),因为蝙蝠没有继承接口,同样也会报错,因此java中的接口继承为严格的继承。

二、python继承

#定义鸟类飞行方法

classBirdFlyable():deffly(self):pass

#定义鸟类

classBird(BirdFlyable):deffly(self):print(‘bird is flying‘)#定义蝙蝠

classBianfu():deffly(self):print(‘Bianfu is flying‘)#增加方法,希望传入鸟类飞行方法

deffly1(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] instanceofArray)){this.name=name;this.methods=[];for(var index inmethods){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

var interface=arguments[i];//获取接口中所含的所有方法

for(var j=0,methods=interface.methods;j

}

}

}

}else{throw new Error(‘接口检验错误,参数至少两位‘)

}

}//定义From类

//实现接口1和接口2中的方法

functionForm(){this.add=function(){

alert(‘add‘);

};this.delete=function(){

alert(‘delete‘)

};this.modify=function(){

alert(‘modify‘)

};this.query=function(){

alert(‘query‘)

}

}//实例化类

var form =newForm();//做借口检查

Interface.checkInterface(form,interface1,interface2)

form.add();

原文:http://www.cnblogs.com/jyyzzjl/p/5111796.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值