実際には、コメントでインターフェイスを定義し、実際のコードに実装できます
例:
/*
interface Composite {
function add(child);
function getChild(index); 🎜>interface FormItem {
function save();
}
*/
var CompositeForm = function(id, method, action) { // Composite, FormItem
...
};
// 複合インターフェースを実装します。
CompositeForm.prototype.add = function(child) {
...
}; child) {
...
};
CompositeForm.prototype.getChild = function(index) {
...
}; FormItem インターフェイスを実装します。 🎜>CompositeForm.prototype.save = function() {
...
};
インターフェイスを実装したプログラマーはこれらすべてのインターフェイスを実装しましたか?保証はできません!インターフェイスが実装されているかどうかを確認する方法がないため
インターフェイスが実装されているかどうかを確認するメカニズムが必要です。これは次のようなものです。
コードをコピー
function save();
*/
var CompositeForm = function(id, メソッド, アクション) {
this.implementsInterfaces = ['Composite ', 'FormItem'];
...
};
...
function addForm(formInstance) {
if(!implements(formInstance) , 'Composite', 'FormItem' )) {
throw new Error("オブジェクトは必要なインターフェイスを実装していません。");
}
...
}
//
// オブジェクトが必要なインターフェイスを実装することを宣言しているかどうかを確認する関数を実装します。 ) { // 最初の引数の後のすべての引数
//
varinterfaceFound = false; object.implementsInterfaces.length; j ) {
if(object.implementsInterfaces[j] == インターフェース名) {
break;
}
} >if(!interfaceFound) {
return false; // インターフェイスが見つかりませんでした。
}
return true; // すべてのインターフェイスが見つかりました。 🎜>このメソッドを使用すると、プログラマーは、どのインターフェイスが実装されているかを記述することができます: this.implementsInterfaces = ['Composite', 'FormItem']; 呼び出し時に、implements メソッドを使用して、それが理論的に実装可能かどうかを判断します。実装は「Composite」インターフェイスで記述されている可能性が非常に高いですが、コード内に add メソッドがありません。したがって、インターフェイスを実装するクラスにインターフェイス内のメソッドが含まれているかどうかを確認する必要があります。したがって、インターフェイスからコメントを削除する必要があります:
コードをコピー
コードは次のとおりです:
//インターフェイス。
var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
var FormItem = new Interface('FormItem', ['save']);
// CompositeForm クラス
var CompositeForm = function(id, method, action) { // Composite, FormItem
...
} を実装します
...
function addForm (formInstance) {
Interface.ensureImplements(formInstance, Composite, FormItem);
// 必要なメソッドが実装されていない場合、この関数はエラーをスローし、
// 関数の実行を停止します。 >// この行の下にあるすべてのコードは、チェックに合格した場合にのみ実行されます。
コードをコピー
コードは次のとおりです:
// コンストラクター。
var Interface = function(name,messages) {
if(arguments.length ! = 2) {
throw new Error("arguments.length
" 引数で呼び出されたインターフェイス コンストラクターですが、正確に 2 つ必要です。");
this.name = name; this.methods = [];
for(var i = 0, len =methods.length; i
if(typeofmethods[i] !== 'string') {
throw new Error(" インターフェイス コンストラクターはメソッド名が文字列として渡されることを期待しています。"
}
this.methods.push(methods[i]); }
};
インターフェイス追加建议インターフェイスがどうか实现の静的メソッド
//コンストラクタ。
Interface.ensureImplements = function(object) {
if(arguments.length < 2) {
throw new Error("関数 Interface.ensureImplements が "
arguments.length " 引数で呼び出されましたが、少なくとも 2 が予想されます。");
}
for(var i = 1, len = argument.length; i
len; i ) {
var インターフェース = argument[i];
if(interface.constructor !== Interface) {
throw new Error("Function Interface.ensureImplements は引数を期待しています"
"2 つ以上は Interface のインスタンスです。");
}
for(var j = 0,methodsLen =interface.methods.length; j varmethods=interface.methods[j];
if(!object[メソッド] || typeof object[メソッド] !== 'function') {
throw new Error("Function Interface.ensureImplements: オブジェクト "
" は " インターフェイスを実装していません.name
" インターフェース。メソッド " メソッド " が見つかりませんでした。");
}
}
}
};