Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

Ruby応用 | Duck Typing

パンくず

Ruby応用
Duck Typing

概要

Duck Typingについて

Duck Typingとは

Dave Thomas
If it walks like a duck and quacks like a duck, it must be a duck.
(アヒルのように歩き,アヒルのように鳴くものはアヒルに違いない)

という言葉に表されるように、静的な言語と異なり
振る舞いさえ同じなら同じように扱うことができます。

これにより静的な言語と比べて簡潔な記述で同様の機能を実現することができます。

比較

静的クラス:継承で親の型を利用するか、インターフェースの実装しインターフェースで呼び出すことで利用可能
動的クラス:振る舞いさえ同じならよい

Javaコード継承

public class Programmer {
  public void coding(){
    System.out.println('coding');
  }
}

public class JavaProgrammer extends Programmer {
  public void coding(){
    System.out.println('java coding');
  }
}

public class RubyProgrammer extends Programmer {
  public void coding(){
    System.out.println('ruby coding');
  }
}

List<Programmer> programmerList = new ArrayList<Programmer>();
programmerList.add(new JavaProgrammer());
programmerList.add(new RubyProgrammer());
for (Programmer programmer : programmerList) {
  programmer.coding();
}

Javaコードインターフェース

public interface Programmer {
  public void coding();
}

class JavaProgrammer implements Programmer {
  public void coding(){
    System.out.println('java coding');
  }
}

class RubyProgrammer implements Programmer {
  public void coding(){
    System.out.println('ruby coding');
  }
}

List<Programmer> programmerList = new ArrayList<Programmer>();
programmerList.add(new JavaProgrammer());
programmerList.add(new RubyProgrammer());
for (Programmer programmer : programmerList) {
  programmer.coding();
}

RubyのDuck Typing

class JavaProgrammer
  def coding()
    puts "java coding"
  end
end

class RubyProgrammer
  def coding()
    puts "ruby coding"
  end
end

programmers = [JavaProgrammer.new,RubyProgrammer.new]
programmers.each {|programmer| puts programmer.coding}