Julia ใฎๅค้ใใฃในใใใใฏ OO ใง่จใใจใใใฎๅคๆ ๅใจใชใใ? ใซใคใใฆใฎใใจใ ใ
target version: Julia 0.6.2
ๆฎๆฎตใฏ Scala, Java, Python, Ruby ใใใใไฝฟใฃใฆใใพใใใJulia ใฏใพใ ่จ่ชไปๆงใ่ฆใชใใใณใผใใๆธใใฆใใ็ถๆณใชใฎใงใJulia ใไฝฟใใใชใใๆนใใใใฃใใใใใใใใซใใใใๆฉ่ฝใใใใ?ใ(็ฅใฃใฆใใใฉใใๅ้กใ ใฃใใชใ) ใงใใใฐ่ฉฑใฏ็ตใใใพใใๅคๅใใใไปฅไธ่ชญใฟ้ฒใใใฎใฏๆ้ใฎ็ก้งใงใใ
Julia ใฎๅค้ใใฃในใใใใฏๅฎ่กๆใฎๅใใๅฏพๅฟใใ้ขๆฐ (ๆฏใ่ใ) ใๆจๅฎใใฆ้ธๆใใใใ้ขๆฐใไฝฟ็จใใๆ็นใงๅ จใฆใฎๅฏ่ฝๆงใฎใใๅใซใคใใฆ่ชๆใงใชใใใฐใชใใชใๅถ็ดใใใใพใใ
ไพใใฐไปฅไธใฎใฝใผในใงใฏ save() ใซๆธกใใใๅฏ่ฝๆงใฎใใๅ A, B ใซๅฏพใใฆใใใใใ JSON ๅฝขๅผใฎๆๅญๅใๅ็
งใใ้ขๆฐ to_json(::A), to_json(::B) ใ ย save() ๆ็นใงๆฑบๅฎใใฆใใใใๅคๆ
ใฎใใใซๆฏใ่ใใใจใใงใใพใใ
module Sample1
# A ใจ B ใฎๅใใใ
struct A x::Int end
struct B y::Int end
# ใใใใใซใใฃในใใใๅฏ่ฝใช้ขๆฐใ่ชๆใชใ
to_json(a::A) = "{x:$(a.x)}"
to_json(b::B) = "{y:$(b.y)}"
# ๅค้ใใฃในใใใใง obj ใฎๅใใๅฏพๅฟใใ้ขๆฐใ้ธๆ/ๅฎ่กใใใใจใใงใใ
save(obj) = println(to_json(obj))
save(A(2018)) # {x:2018} โ OK
save(B(0116)) # {y:116} โ OK
endใใใฏ to_json() ใฎๆๅใๅใซๅใใใฆ้ฉๅใซ็ฝฎใๆใใฃใฆใใใใใซ่ฆใใพใใใงใฏ้็บๆ
ๅฝใ่คๆฐไบบใซๅใใฆใขใธใฅใผใซใใใๅฐใ่ค้ใซใชใฃใใจใใๅใๆนๆณใงใงใใใงใใใใใ
ไปไบบใไฝใฃใใใฌใผใ ใฏใผใฏใๅ
ฑ้ๆฉ่ฝใไฝฟใๅ ดๅใsave() ใฎๅฎ่ฃ
ๆ็นใง obj ใจใใฆๆธกใใใๅฏ่ฝๆงใฎใใ (ใฉใใใฎ้ฆฌใฎ้ชจใไฝใฃใใๅใใใชใ) ๅ B ใใใณๅฏพๅฟใใ to_json(::B) ใฏๅ็
งใงใใพใใใ
module Sample2
module Framework
export A, save
# ๅ A ใฎใฟๅฏพๅฟใใ้ขๆฐใๅฎ็พฉใใใฆใใ
struct A x::Int end
to_json(a::A) = "{x:$(a.x)}"
# ๅฎ่กๆใซ obj ใฎๅใใ่งฃๆฑบใงใใใฎใฏ A ใ ใ
save(obj) = println(to_json(obj))
end
module Application
using Sample2.Framework
# ๅ B (ๆฌๆฅใฏ A ใฎใตใใฟใคใใซใใใใจใใใ ใ) ใซๅฏพๅฟใใ้ขๆฐใฏๅฝ็ถใชใใ Framework.save()
# ใใใฏไธๅฏ่ฆ
struct B y::Int end
to_json(b::B) = "{y:$(b.y)}"
save(A(2018)) # {x:2018} โ OK
save(B(0116)) # ERROR: MethodError: no method matching to_json(::Sample2.Application.B)
end
endใใฎๅ ดๅ save(obj, to_json::Function) ใฎใใใซๅฎ็พฉใใฆ obj ใซๅฏพๅฟใใๆฏใ่ใใฎ้ขๆฐ to_json(::B) ใใปใใใงๆธกใใชใใใฐใชใใใๅค้ใใฃในใใใใฏๅคๆ
ๅใไปฃๆฟใใๆฉ่ฝใซใฏใชใฃใฆใใพใใใ
ไธๆนใง OO ใฎๅ ดๅใฏ to_json(::B) ้ขๆฐใฏ obj::B ใซไป้ใใใใ save() ๅ
ใง obj ใฎๅ
ทไฝๅใไฝใใ่ช่ญใใๅฟ
่ฆใฏใชใใsave() ใฏ (A ใฎ
ใตใใฟใคใใงใใใฐ) ไปปๆใฎๅใๅใใใจใใงใใพใใใคใพใ save() ใซๆธกใใใๅฏ่ฝๆงใฎใใๅใๅฎ่ฃ
ๆ็นใงๅ
จใฆ่ชๆใงใใๅฟ
่ฆใใชใ็นใ้ใใพใใOO ใงใฉใคใใฉใช่จญ่จใ่กใ้็บ่
ใฏใใฎๅไฝใๅๆใจใใฆใใพใใ
ๆฌไผผใณใผใใง่กจใใชใไปฅไธใฎใใใชๆใใ
module Framework
export A, save
class A
x::Int
to_json() = "{x:$(this.x)}"
end
save(a::A) = println(a.to_json())
end
module Application
using Framework
class B(x) <: A(x)
y::Int
to_json() = "{x:$(super.x),y:$(this.y)}"
end
save(A(2018)) # {x:2018}
save(B(2018, 0116)) # {x:2018,y:116} โ ๆๅพ
ใใๅไฝ
endใใชใใธใงใฏใใใจ B.to_json() ใๆธกใใใจใจ to_json(::B) ้ขๆฐใงๅฅใซๆธกใใใจใฏๅฎ่ณชๅใใ ใใจใใๆ่ฆใฏใใใฃใจใใงใใใใ ใใใใใฃใๅ้กใ็ฐกๆฝใใคๅฎๅ
จใซ่งฃๆฑบใงใใใใ่จญ่จใใใ่จ่ชใใจใใ็นใ OO ใฎใใฉใใคใ ใๆใค่จ่ชใใฎๅคๆญใซใชใใพใใใงใชใใจ้ขๆฐใใคใณใฟใใใใใ ใใ C ่จ่ชใฏๅฎ่ณชๅคๆ
ๅใๅฏ่ฝใ (็ฌฌไธ็ด้ขๆฐใๆใค่จ่ชใฏๅ
จใฆๅคๆ
ๅใๅฏ่ฝใ ) ใจใใใใจใซใชใ OO is ไฝ? ใจใชใฃใฆใใพใใฎใงใโโใใใฐรรใงใใใ่ซ่ญฐใฏไธๆฏใงใใ
ไปฅไธใใใ็งใจใใฆใฏใๅค้ใใฃในใใใใฏ็นๅฎใฎ็ถๆณไธใงๅคๆ ๅใฎไปฃๆฟใจใใฆๆฉ่ฝใใใใๅคๆ ๅใใฎใใฎใฎไปฃๆฟใจใชใใใๆฉ่ฝใงใฏใชใใใจ่ใใฆใใพใใ
ใใพใฎใจใใ Julia ใฏ่จ็ฎ็งๅญฆๆน้ขใฎใใฉใใจใใใณใผใใๆธใ็จ้ใๅคใใใใชใฎใงๅค้ใใฃในใใใใงใๅๅๆฉ่ฝใใใจๆใใพใใใไปๅพๆฑ็จ่จ่ชใจใใฆ Python ใ Ruby ใฎไปฃๆฟใ็ฎๆใใชใใ่ค้ใซใขใธใฅใผใซๅใใๅฎ่ฃ ใ่กใไธใง้ฒๅใใฆใใ้จๅใใชใจๆใฃใฆใใพใใ
ใชใ Pyhon ใ Ruby ใฎใใใซๅฐๆฅใฎ Julia ใฎใใผใธใงใณใงใฏใฉในใใคใณใฟใผใใงใผใน็ญใฎ OO ็ใชใใฉใใคใ ใ่ฟฝๅ ใใใฆใๅ้กใฎใชใ่จ่ชไปๆงใซใชใฃใฆใใใจใฏๆใใพใ (้็บๅดใซใใฎๆๆใใใใใฏๅใใใพใใใ)ใ
ใชใญใผใใใใซๆธใใฆใใใฎใง2ใคไธใฎๆธใ่พผใฟใซๆฐใฅใใใใฟใพใใใ