up:: Programming
source:: ダックタイピング、あるいは私の頭の中のインターフェース - WonderPlanet Developers’ Blog
source:: ダック・タイピングがダメな理由 | GWT Center
source:: 「動的型付言語は使い物にならない」か? - give IT a try

動的型付け言語の言葉。

# アヒルクラス
class Duck
  def quack(n)
    n.times do
      puts "quack!"
    end
  end
end
 
# アヒルっぽい鳥クラス
class DuckyBird
  def quack(n)
    n.times do
      puts "QUACK!"
    end
  end
end
 
# アヒル小屋クラス
class DuckHouse
  def initialize(ducks)
    @ducks = ducks
  end
 
  # 開けると、中にいたやつがそれぞれ2回鳴いて出ていく
  def open
    @ducks.each do |duck|
      duck.quack(2)
    end
    @ducks = nil
  end
end
 
duck = Duck.new
ducky = DuckyBird.new
 
duck_house = DuckHouse.new([duck, ducky])
duck_house.open

引数に「ある関数が実装されていること」を期待して、関数を作る手法。名称の由来は「アヒルのように振る舞えばそれはアヒルである」という意味合いから。

これが何なのかは、静的型付け言語で書き直すと分かる。

public interface IDuck
{
    void quack(int n);
}
 
public class Duck implements IDuck
{
    public void quack(int n)
    {
        for(int i = 0; i < 2; ++i)
        {
            System.out.println("quack!");
        }
    }
}
 
public class DuckyBird implements IDuck
{
    public void quack(int n)
    {
        for(int i = 0; i < 2; ++i)
        {
            System.out.println("QUACK!");
        }
    }
}
 
public class DuckHouse
{
    private IDuck[] ducks;
    public DuckHouse(IDuck[] ducks)
    {
        this.ducks = ducks;
    }
 
    public void open()
    {
        for(IDuck duck : ducks)
        {
            duck.quack(2);
        }
        ducks = null;
    }
}
 
public class Main
{
    public static void main(String[] args) throws Exception
    {
        IDuck duck = new Duck();
        IDuck duckyBird = new DuckyBird();
 
        DuckHouse duckHouse = new DuckHouse(new IDuck[] { duck, duckyBird });
        duckHouse.open();
    }
}

まんまinterface
動的型付けはそういうのを書かなくても書ける、という楽さが強みなので、こうしたものが生まれる。

動的と静的の違いはこちら。
これによると、pythonは全部オブジェクトの動的型付け異端児的扱いらしい。
動的型付けと静的型付け - Qiita