ポリモーフィズム
ポリモーフィズムって何なのかってことをつかむために「じゅんいち☆かとうの技術日誌」さんhttp://d.hatena.ne.jp/j5ik2o/20080508/1210246936
に書かれていたサンプルをpythonで書いてみた。
Javaのサンプルコードをそのままpythonに適用しただけなので、基本的に冗長になってます。
まずはAnimal class
pythonにはインターフェイスが無いのでここは実質意味は無いけど練習なのでとりあえず書くと、
>>> class Animal: ...: def cry(self): ...: pass ...: def run(self): ...: pass ...: def sit(self): ...: pass ...: def sanpo(self): ...: pass ...: ...:
ここではメソッドを宣言してるだけ。
次はAbstractAnimal class
>>> class AbstractAnimal(Animal): ...: def sanpo(self): ...: self.run() ...: self.cry() ...: self.sit() ...: ...:
sanpo()メソッドを実装。
つづいてCat class
>>> class Cat(AbstractAnimal): ...: def cry(self): ...: print "nyannyan" ...: def run(self): ...: print "nyannyan run" ...: def sit(self): ...: print "nyanyan sit" ...: ...:
ここでは猫を実装。
ここでちょっと試してみる。
Cat classのインスタンスオブジェクトを呼び出して、sanpo()メソッドを使うと、
>>> cat = Cat() >>> cat.sanpo() nyannyan run nyannyan nyanyan sit
大丈夫みたいなので、犬を実装してやっぱり試してみると、
>>> class Dog(AbstractAnimal): ...: def cry(self): ...: print "wanwan" ...: def run(self): ...: print "wanwan run" ...: def sit(self): ...: print "wanwan sit" ...: ...: >>> dog = Dog() >>> dog.sanpo() wanwan run wanwan wanwan sit
次はAnimalFactory class
ここもインターフェイスだからあまり意味なし。
>>> class AnimalFactory(object): ....: def create(self, animalword): ....: pass ....: ....:
ここではcreateメソッドを宣言。
最後にAnimalFactoryImpl class
>>> class AnimalFactoryImpl(AnimalFactory): ....: def create(self, animalword): ....: if animalword.lower() == "dog": ....: return Dog() ....: elif animalword.lower() == "cat": ....: return Cat() ....: return None ....: ....:
ここではcreateメソッドを実装。
それではAnimalFactoryImpl classのインスタンスオブジェクトを呼び出して
createメソッドで"dog"を指定してやると、
>>> af = AnimalFactoryImpl() >>> animal = af.create("dog") >>> animal.sanpo() wanwan run wanwan wanwan sit 変数animalにDog classのインスタンスを代入できて、sanpoメソッドを使うと。
"cat"を指定すれば、Cat classのインスタンスができる。
>>> animal2 = af.create("cat") >>> animal2.sanpo() nyannyan run nyannyan nyanyan sit
Dog classもCat classもsanpoメソッドを実装しているから共通のメソッドが使える。
つまり、メソッドを呼び出す側を共通化できることがポリモーフィズムなわけだ。