Duck Typing介绍

介绍

在动态语言的世界里一直流传着一种叫做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();

参考资料

1.http://www.cnblogs.com/whitewolf/p/3163358.html

2.https://en.wikipedia.org/wiki/Duck_typing

你可能感兴趣的:(JavaScript,python,=Programming,Languages=)