abstract typeとstructの関係についてのメモ
以下では、Juliaの抽象型(abstract type)と構造体(struct)を使用して、アザラシ(Azarashi)という抽象型を基本とするいくつかの異なる具象型(Goma, Haiiro, Minami)を定義している。
抽象型と具象型の定義
abstract type Azarashi end
struct Goma<:Azarashi
nakigoe::String
weight::Float64
height::Float64
end
GomaはAzarashiとして型注釈されているため、Azarashi型のサブタイプとなります。
パラメトリックな具象型の定義とコンストラクタの定義
begin
struct Haiiro{T<:Real}<:Azarashi
nakigoe::String
weight::T
height::T
seisokuti::String
end
function Haiiro(nakigoe::String)
weight = rand() * 100
height = rand() * 100
seisokuti = "Osaka"
return Haiiro(nakigoe, weight, height, seisokuti)
end
end
Haiiroはパラメトリックな具象型を定義しており、weightとheightはReal型のサブタイプをとることができる。また、ランダムな重さと高さを生成するコンストラクタも定義している。
別の具象型の定義
struct Minami<:Azarashi
nakigoe::String
weight::Float64
height::Float64
end
多重ディスパッチの関数定義
f関数は、入力の型に応じて異なる振る舞いをする多重ディスパッチの例である。
begin
function f(a::Azarashi)
return a.height
end
function f(h::Haiiro)
h.seisokuti
end
end
begin
ga = Goma("Kyu", 100, 1000)
f(ga)
end
begin
ha = Haiiro("Kyu!")
f(ha)
end
ha2 = Haiiro("Kyu!", 120, 120, "Wakayama")
begin
ma = Minami("Kyu!!" , 120, 120)
f(ma)
end
まとめ
abstract typeは抽象型を定義するために使用され、具象型の基底として機能する。
structは具象型を定義するために使用され、特定の抽象型のサブタイプとして定義されることがある。
Juliaでは、関数は多重ディスパッチをサポートしており、関数の振る舞いは引数の型に依存する。
このコードはJuliaの型システムと多重ディスパッチを利用して、異なる種類のアザラシを表現し、それらの異なる属性に基づいて動作する関数を定義することができる。