『第127回 Ruby vs Java ダックタイピングとインタフェースで見る多態性』を読んで Java のインターフェースが何で必要なのか何となく理解できた気がするのでPythonで書いてみる。
Python でダックタイピング
ducktyping.py
class Human: def touch(self, something): something.say() class Duck: def say(self): print("quack-quack") class Dog: def say(self): print("woof-woof") if __name__ == '__main__': human = Human() duck = Duck() dog = Dog() human.touch(duck) #-> quack-quack human.touch(dog) #-> woof-woof
Java でダックタイピング
DuckTyping.java
前述の python のコードの様に Java も書こうとすると Human のメソッドで 型を指定しないといけない、が Duck と Dock がある。
なのでインターフェースを使う。
- interface Animal 作る
- Human の touch メソッドで 型を指定(Animal animal)
- Duck と Dog で implements Animal
public class DuckTyping { public interface Animal { public void say(); } public static class Human { public void touch(Animal animal) { animal.say(); } } public static class Duck implements Animal { public void say() { System.out.println("quack-quack"); } } public static class Dog implements Animal { public void say() { System.out.println("woof-woof"); } } public static void main(String[] args) { Human human = new Human(); Duck duck = new Duck(); Dog dog = new Dog(); human.touch(duck); //-> quack-quack human.touch(dog); //-> woof-woof } }