Julia中类的方法的多重调度

时间:2015-09-23 00:12:44

标签: julia overloading multiple-dispatch

我的问题是如何在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与最后一个的定义(在这种情况下为矩阵版本)。

1 个答案:

答案 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}的子类型。