5

我的问题是如何在 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标量向量还是矩阵,它会调用相应版本的setvalue方法。现在,使用上面的定义,它会覆盖setvalue最后一个(在这种情况下为矩阵版本)的定义。

4

1 回答 1

10

这种类型的面向对象编程 (OOP),其中函数存在于对象中,在 Julia 中没有使用。

相反,在 Julia 中,我们只是在对象定义之外定义方法。例如:

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。我已经相应地改变了我的答案。指定为 as 的参数v::Vector{Real}永远不会匹配参数,因为不可能创建抽象类型的对象Real,并且类型的不变性意味着对象 likeVector{Float64}不是 的子类型Vector{Real}

于 2015-09-23T05:11:44.173 回答