我的问题是如何在Julia的某个班级中重载某些方法?
换句话说,假设我有一个类的以下定义:
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
是标量,向量还是矩阵,它会调用{{1}的相应版本}} 方法。现在,根据上面的定义,它会覆盖setvalue
与最后一个的定义(在这种情况下为矩阵版本)。
答案 0 :(得分:9)
这种面向对象编程(OOP)的方式,其中函数存在于对象内部,在Julia中没有使用。
相反,在Julia中我们只定义外部对象定义的方法。 E.g:
type Sometype
prop::String
end
Sometype(v::Real) = ...
function Sometype{T}(v::Vector{T}) # parametric type
....
end
请注意,第一个定义是在单行上定义简单函数的简单方法的示例,第二个示例是用于更复杂的函数。
正如@GnimucKey指出的那样,您应该使用v::Vector{Real}
和v::Vector{T}
参数化的函数来代替T
。我已相应地改变了我的答案。指定为v::Vector{Real}
的参数将从不匹配参数,因为无法创建抽象类型Real
的对象,类型的不变性意味着像{的对象{1}}不是Vector{Float64}
的子类型。