パンくず
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}