我想这可以适用于任何动态语言,但我使用的一个是JavaScript的。 我们有我们正在写一对夫妇在JavaScript中需要暴露出的send()函数,然后由承载JavaScript的网页称为控件的情况。 我们有一个包含了定义此发送函数对象的数组,所以我们通过收集和重复发送呼叫()对每个对象。
在面向对象的语言,如果你想要做同样的事情,你必须有必须由每个控制实施的发送()函数的iControl接口,然后你必须ICONTROL实现,你会遍历集合通过并调用发送方法。
我的问题是,用JavaScript是一门动态语言,是否有任何需要确定其控制方式应该继承的接口,或者是它不够好,只是调用发送露出上的控件()函数?
动态语言经常鼓励鸭打字 ,其中对象的方法决定应该如何使用,而不是一个明确的合同(如接口)。
既然你可以调用任何对象的任何方法在动态语言,我不知道接口是如何发挥作用的任何真正有用的方式。 有没有合同执行,因为一切都在调用时确定的 - 一个对象甚至可以改变它是否符合一个“契约”通过它的生活方法添加和整个运行时间删除。 如果对象不履行合同的通话将失败,或者如果它没有实现的成员将会失败 - 这两种情况下是最实用的目的是相同的。
这是PHP一样的; 你并不真正需要的接口。 但它们存在于建筑需求。 在PHP中,你可以指定功能,这可能是有用的类型提示。
其次,接口是一个合同。 这是从这个接口的所有对象都具有这些功能的正式合同。 更好地确保你的类满足这些要求,而不是记住:“MM,这个类isEnabled()
但另一种是checkIfEnabled()
”。 接口帮助您标准化。 其他派生的对象上的工作没有检查名称是否是isEnabled
或checkIfEnabled
(最好让翻译赶上这些问题)。
我们看到在页面下方一个很好的实现,这是我们(短版吧)
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
在接口另一种方法是通过提供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!