介绍
在动态语言的世界里一直流传着一种叫做Duck Typing的风格:
When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.
从duck typing,我们可以联想到它的推导,并不在乎类型的真正实体,只要他的行为有duck的特性,那么我们就可以把它当做一只duck来看到。在动态语言设计中,可以解释为无论一个对象是什么类型的,只要它具有某类型的行为(方法),则它就是这一类型的实例,而不在于它是否显示的实现或者继承。
像C++一类的静态类型(static type)语言,传入的参数必须要是所要求的类型才行,要想表现出不同的行为,就等通过继承、多态等机制,然而对于python, javascript, ruby等动态类型语言则不需要严格符合类型要求,只要实现了对应的方法就可以了。
python实现duck typing的例子
class Duck:
def quack(self):
print("Quack, quack!");
def fly(self):
print("Flap, Flap!");
class Person:
def quack(self):
print("I'm Quackin'!");
def fly(self):
print("I'm Flyin'!");
def in_the_forest(mallard):
mallard.quack()
mallard.fly()
in_the_forest(Duck())
in_the_forest(Person())
输出:
Quack, quack!
Flap, Flap!
I'm Quackin'!
I'm Flyin'!
Javascript实现duck typing的例子
function Duck() {}
Duck.prototype.quack = function() {alert('Quaaaaaack!');};
Duck.prototype.feathers = function() {alert('The duck has white and gray feathers.');};
function Person() {}
Person.prototype.quack = function() {alert('The person imitates a duck.');};
Person.prototype.feathers = function() {alert('The person takes a feather from the ground and shows it.');};
Person.prototype.name = function() {alert('John Smith');};
function inTheForest(object) {
object.quack();
object.feathers();
}
function game() {
var donald = new Duck();
var john = new Person();
inTheForest(donald);
inTheForest(john);
}
game();