23

これはどの動的言語にも当てはまると思いますが、私が使用しているのはJavaScriptです。JavaScriptでいくつかのコントロールを記述していて、Send()関数を公開する必要があります。この関数は、JavaScriptをホストするページによって呼び出されます。このSend関数が定義されたオブジェクトの配列があるため、コレクションを反復処理して、各オブジェクトに対してSend()を呼び出します。

オブジェクト指向言語では、同様のことをしたい場合は、各コントロールで実装する必要のあるSend()関数を持つIControlインターフェイスがあり、それから反復するIControl実装のコレクションがあります。を介してsendメソッドを呼び出します。

私の質問は、JavaScriptが動的言語である場合、コントロールが継承するインターフェイスを定義する必要があるのか​​、それともコントロールで公開されているSend()関数を呼び出すだけで十分なのかということです。

4

5 に答える 5

9

動的言語はしばしばダックタイピングを奨励します。ダックタイピングでは、オブジェクトのメソッドが、明示的なコントラクト(インターフェイスなど)ではなく、オブジェクトの使用方法を指示します。

于 2009-09-14T04:20:40.820 に答える
4

これはPHPでも同じです。本当にインターフェースは必要ありません。しかし、それらはアーキテクチャのニーズのために存在します。PHPでは、便利な関数の型ヒントを指定できます。

第二に、インターフェースは契約です。このインターフェースのすべてのオブジェクトがこれらの関数を持つことは正式な契約です。クラスがこれらの要件を満たしていることを確認する方が、覚えておくよりも優れています。「mm、このクラスにはありますisEnabled()が、もう1つはcheckIfEnabled()」です。インターフェイスは標準化に役立ちます。isEnabled派生オブジェクトで作業している他の人は、名前がまたはであるかどうかを確認する必要はありませんcheckIfEnabled(インタプリタにそれらの問題をキャッチさせる方がよい)。

于 2009-09-14T04:18:52.543 に答える
3

動的言語で任意のオブジェクトの任意のメソッドを呼び出すことができるので、インターフェイスが本当に便利な方法でどのように機能するかはわかりません。すべてが呼び出し時に決定されるため、強制するコントラクトはありません。オブジェクトは、実行時にメソッドが追加および削除されるときに、その存続期間を通じて「コントラクト」に準拠するかどうかを変更することもできます。オブジェクトがコントラクトを満たさない場合、呼び出しは失敗します。メンバーを実装しない場合、呼び出しは失敗します。どちらの場合も、ほとんどの実用的な目的で同じです。

于 2009-09-14T04:17:22.437 に答える
2

以下のページで素晴らしい実装を見ました、これは私たちのものです(それの短いバージョン)

var Interface = function (methods) {
    var self = this;
    self.methods = [];

    for (var i = 0, len = methods.length; i < len; i++) {
        self.methods.push(methods[i]);
    }

    this.implementedBy = function (object) {

        for (var j = 0, methodsLen = self.methods.length; j < methodsLen; j++) {
            var method = self.methods[j];
            if (!object[method] || typeof object[method] !== 'function') {
                return false;
            }
        }
        return true;
    }
};

//Call
var IWorkflow = new Interface(['start', 'getSteps', 'end']);
if (IWorkflow.implementedBy(currentWorkFlow)) {
    currentWorkFlow.start(model);
}

全体の例は次の場所にあります: http ://www.javascriptbank.com/how-implement-interfaces-in-javascript.html

于 2012-09-18T08:17:51.667 に答える
0

インターフェイスの別の代替手段はbob.jsによって提供されます:

1.インターフェースが実装されているかどうかを確認します。

var iFace = { say: function () { }, write: function () { } };  
var obj1 = { say: function() { }, write: function () { }, read: function () { } }; 
var obj2 = { say: function () { }, read: function () { } }; 
console.log('1: ' + bob.obj.canExtractInterface(obj1, iFace)); 
console.log('2: ' + bob.obj.canExtractInterface(obj2, iFace)); 
// Output: 
// 1: true 
// 2: false 

2.オブジェクトからインターフェースを抽出し、それでも関数を適切に実行します。

var obj = {  
    msgCount: 0, 
    say: function (msg) { console.log(++this.msgCount + ': ' + msg); }, 
    sum: function (a, b) { console.log(a + b); } 
}; 
var iFace = { say: function () { } }; 
obj = bob.obj.extractInterface(obj, iFace); 
obj.say('Hello!'); 
obj.say('How is your day?'); 
obj.say('Good bye!'); 
// Output: 
// 1: Hello! 
// 2: How is your day? 
// 3: Good bye! 
于 2013-04-04T19:25:16.470 に答える