interface Animal{
public void eat;
public void sleep;
}
class Person implements Animal{
public void eat(){
...
}
public void sleep(){
...
}
}
interface Animal{
public void eat;
public void sleep;
}
class Person implements Animal{
public void eat(){
...
}
public void sleep(){
...
}
}
以上是我们熟悉的java代码中的接口定义及其实现。
但是我们想要在js中实现类似的接口功能怎么办呢?
首先,我们要明确接口是用来声明一个类行为的,而不去做具体的功能实现,而实现该接口的类则必须要实现接口中声明的方法。因而我们需要一个类来表示接口的声明,这个类一定要保存接口的名称,我们可以通过一个string类型的变量保存该属性,有了类名称,我们接下俩要保存的就是该接口声明的方法,因为方法不止一个,因而我们需要一个Array类型来进行保存,因此我们有了:
var Interface = function(name, methods){
var argLen = arguments.length;
if(argLen != 2){
throw new Error("Interface类的构造函数需要至少两个参数!");
}
this.name = name; // 用来保存接口名称
this.methods = []; // 用来保存要实现的方法名称
var i = 0,
methodLen = methods.length;
for(; i<methodLen; i++){
var method = methods[i];
if(typeof method ){
throw new Error("Interface类构造函数中的methods参数应该是string[]类型");
}
methods.push(method);
}
}
// 接口声明方式
var Animal= new Interface('Animal', ['eat', 'sleep']);
这样我们就有了接口的声明类,接下来我们要做的就是接口的实现。
要做就是去验证一个类是否实现一个接口,我们可以在上面的Interface类中添加一个类方法,作为验证一个类是否实现一个接口,这个方法就需要传入参数接口名称和该实现类。
Interface.ensureImpelements = function(object){
var len = arguments.length;
if(len < 2){
throw new Error("方法Interface.ensureImplements需要至少两个参数!");
}
var i = 1;
for(; i<len; i++){
var interface = arguments[i];
if(interface.constructor != Interface){
throw new Error("方法Interface.ensureImplements参数需要Interface的实例对象!"); }
var j = 0,
methodsLen = interface.methods.length;
for(; j<methodsLen; j++){
var method = interface.methods[j];
if(!object[method] || typeof object[method] != "function"){
throw new Error("方法Interface.ensureImplements : object 没有实现" + interface.name + " 接口. 方法" + method + " 没有被找到!");
}
}
}
}
// 定义Person类实现接口Animal接口中的方法
var Person = function(){};
Person.prototype = {
eat : function(){...},
sleep : function(){...}
}
//创建对象_person
var _person = new Person();
// 检验Person类的_person对象是否实现了Animal接口
Interface.ensureImpelements(_person, Animal);
这样我们就在js中基本上实现了接口的声明,和检测一个对象是否实现了该接口的方法。
注意:与java中不同的是,这里对于是否实现接口的检验只是针对实现类对象的检验,代码中传入的参数_person就是Animal接口的实现类Person的一个实例。
若要是改成为检测实现类是否实现了接口中声明的方法,代码如下:
Interface.ensureImpelements = function(object){
var len = arguments.length;
if(len < 2){
throw new Error("方法Interface.ensureImplements需要至少两个参数!");
}
var i = 1;
for(; i<len; i++){
var interface = arguments[i];
if(interface.constructor != Interface){
throw new Error("方法Interface.ensureImplements参数需要Interface的实例对象!"); }
var j = 0,
methodsLen = interface.methods.length;
for(; j<methodsLen; j++){
var method = interface.methods[j];
// 这里因为传入的object为类的定义,因此要判断其原型中的方法
if(!object.prototype[method] || typeof object.prototype[method] != "function"){
throw new Error("方法Interface.ensureImplements : object 没有实现" + interface.name + " 接口. 方法" + method + " 没有被找到!");
}
}
}
}
// 定义Person类实现接口Animal接口中的方法
var Person = function(){};
Person.prototype = {
eat : function(){...},
sleep : function(){...}
}
// 检验Person类的是否实现了Animal接口
Interface.ensureImpelements(Person, Animal);
转载于: