Julia 中 class 方法的多重分派
Multiple dispatch for methods of a class in Julia
我的问题是如何在 Julia 中的某个 class 中 中重载某个方法 ?
换句话说,假设我对 class 有如下定义:
type Sometype
prop::String
setValue::Function
# constructor
function Sometype()
this = new ()
this.prop = ""
####### v1 #######
this.setValue = function(v::Real)
println("Scalar Version was Invoked!")
# operations on scalar...
# ...
end
####### v2 #######
this.setValue = function(v::Vector{Real})
println("Vector Version was Invoked!")
# operations on vector...
# ...
end
####### v3 #######
this.setValue = function(v::Matrix{Real})
println("Matrix Version was Invoked!")
# operations on Matrix...
# ...
end
return this
end
end
所以当我在主代码中说:
st = Sometype()
st.setValue(val)
取决于val
是标量、向量还是矩阵它将调用相应版本的 setvalue
方法。现在,根据上面的定义,它用最后一个(在本例中为矩阵版本)覆盖 setvalue
的定义。
Julia 不使用这种面向对象编程 (OOP) 风格,其中函数位于对象内部。
相反,在 Julia 中,我们只是在对象定义之外 定义方法。例如:
type Sometype
prop::String
end
Sometype(v::Real) = ...
function Sometype{T}(v::Vector{T}) # parametric type
....
end
请注意,第一个定义是在一行中定义简单函数的简写方式示例,第二个示例是更复杂的函数。
正如@GnimucKey 指出的那样,您应该使用 v::Vector{T}
和 T
参数化的函数,而不是 v::Vector{Real}
。我相应地改变了我的答案。指定为 v::Vector{Real}
的参数将 永远不会 匹配参数,因为不可能创建抽象类型 Real
的对象,并且类型的不变性意味着Vector{Float64}
之类的对象不是 Vector{Real}
.
的子类型
我的问题是如何在 Julia 中的某个 class 中 中重载某个方法 ?
换句话说,假设我对 class 有如下定义:
type Sometype
prop::String
setValue::Function
# constructor
function Sometype()
this = new ()
this.prop = ""
####### v1 #######
this.setValue = function(v::Real)
println("Scalar Version was Invoked!")
# operations on scalar...
# ...
end
####### v2 #######
this.setValue = function(v::Vector{Real})
println("Vector Version was Invoked!")
# operations on vector...
# ...
end
####### v3 #######
this.setValue = function(v::Matrix{Real})
println("Matrix Version was Invoked!")
# operations on Matrix...
# ...
end
return this
end
end
所以当我在主代码中说:
st = Sometype()
st.setValue(val)
取决于val
是标量、向量还是矩阵它将调用相应版本的 setvalue
方法。现在,根据上面的定义,它用最后一个(在本例中为矩阵版本)覆盖 setvalue
的定义。
Julia 不使用这种面向对象编程 (OOP) 风格,其中函数位于对象内部。
相反,在 Julia 中,我们只是在对象定义之外 定义方法。例如:
type Sometype
prop::String
end
Sometype(v::Real) = ...
function Sometype{T}(v::Vector{T}) # parametric type
....
end
请注意,第一个定义是在一行中定义简单函数的简写方式示例,第二个示例是更复杂的函数。
正如@GnimucKey 指出的那样,您应该使用 v::Vector{T}
和 T
参数化的函数,而不是 v::Vector{Real}
。我相应地改变了我的答案。指定为 v::Vector{Real}
的参数将 永远不会 匹配参数,因为不可能创建抽象类型 Real
的对象,并且类型的不变性意味着Vector{Float64}
之类的对象不是 Vector{Real}
.