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)