Juliaで多重ディスパッチ
多重ディスパッチとは
実行時に引数の型からマッチングした関数を選択して実行することである.
Juliaでの実装
まずは型を定義する.ありがちなDogとCatの型を考える.いずれも動物なのでAnimal型を継承している.型の継承は継承先 <: 継承元
という文法.
# 抽象型を定義 abstract type Animal end # 具体型としてDogとCat struct Dog <: Animal name::String age::Int64 end struct Cat <: Animal name::String age::Int64 end
個別の関数
まずはそれぞれの具体型DogとCatに従って異なる動作をする同じ名前の関数を定義する.
# 引数の部分で型を指定することで,同名の関数でも呼び出される関数に違いを作ることができる. function print_hoge(animal::Dog) @show "いぬ" end function print_hoge(animal::Cat) @show "ねこ" end
動作の確認をする.
dog = Dog("inu", 10) cat = Cat("neko", 3) # それぞれ定義した関数が呼び出されていることを確認できる. print_hoge(dog) print_hoge(cat)
共通した関数
次に,共通した型で使える関数を定義する. 名前を出力する関数の定義.いずれもAnimal型なので引数の型をAnimalとして指定する.
function print_name(animal :: Animal) @show animal.name end
# 確認 dog = Dog("inu", 10) cat = Cat("neko", 3) print_name(dog) print_name(cat)