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}.

的子类型