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