jsでのインタフェースの定義

3481 ワード

interface Animal{
    public void eat;
    public void sleep;
}

class Person implements Animal{
    public void eat(){
        ...
    }
    public void sleep(){
        ...
    }
}

以上は、よく知られているjavaコードのインタフェース定義とその実装です.
しかし、jsで似たようなインタフェース機能を実現したい場合はどうすればいいのでしょうか.
まず、インタフェースは、特定の機能実装ではなく、クラスの動作を宣言するために使用されることを明確にし、インタフェースを実装するクラスは、インタフェースで宣言された方法を実装する必要があります.したがって、インタフェースの宣言を表すクラスが必要です.このクラスはインタフェースの名前を保存する必要があります.stringタイプの変数で属性を保存することができます.クラス名があります.次に、インタフェース宣言の方法を保存します.方法は1つだけではありませんので、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);