牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Python と Java と ダックタイピングとインタフェースのメモ

第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
    }
}