Как создать «единый диспетчерский объектно-ориентированный класс» в julia, который ведет себя как стандартный Java-класс с открытыми / закрытыми полями и методами

Я прочитал в книге, что «вы не можете создавать традиционные« классы »в julia с методами единой отправки, такими какobj.myfunc()«... и я подумал, что это больше похоже на вызов, чем на факт.

Так вот мойJavaClass Напечатайте с открытыми / закрытыми полями и методами только для того, чтобы испытать шок и ужас от того, что у Джулии было что-то уродливое, после того, как разработчики постарались избежать этого:

type JavaClass

    # Public fields
    name::String

    # Public methods
    getName::Function
    setName::Function
    getX::Function
    getY::Function
    setX::Function
    setY::Function

    # Primary Constructor - "through Whom all things were made."
    function JavaClass(namearg::String, xarg::Int64, yarg::Int64)

        # Private fields - implemented as "closed" variables
        x = xarg
        y = yarg

        # Private methods used for "overloading"
        setY(yarg::Int64) = (y = yarg; return nothing)
        setY(yarg::Float64) = (y = Int64(yarg * 1000); return nothing)

        # Construct object
        this = new()
        this.name = namearg
        this.getName = () -> this.name
        this.setName = (name::String) -> (this.name = name; return nothing)
        this.getX = () -> x
        this.getY = () -> y
        this.setX = (xarg::Int64) -> (x = xarg; return nothing)
        this.setY = (yarg) -> setY(yarg) #Select appropriate overloaded method

        # Return constructed object
        return this
    end

    # a secondary (inner) constructor
    JavaClass(namearg::String) = JavaClass(namearg, 0,0)
end

Пример использования:

julia> a = JavaClass("John", 10, 20);

julia> a.name # public
"John"

julia> a.name = "Jim";

julia> a.getName()
"Jim"

julia> a.setName("Jack")

julia> a.getName()
"Jack"

julia> a.x # private, cannot access
ERROR: type JavaClass has no field x

julia> a.getX()
10

julia> a.setX(11)

julia> a.getX()
11

julia> a.setY(2) # "single-dispatch" call to Int overloaded method

julia> a.getY()
2

julia> a.setY(2.0)

julia> a.getY()  # "single-dispatch" call to Float overloaded method
2000

julia> b = JavaClass("Jill"); # secondary constructor

julia> b.getX()
0

По сути, конструктор становится замыканием, и именно так создаются «приватные» поля и методы / перегрузки. Какие-нибудь мысли? (Кроме как"OMG Почему ??? Зачем ты это делаешь?")
Любые другие подходы?
Любые сценарии, которые вы могли бы предусмотреть, где это может провалиться эффектно?

Ответы на вопрос(1)

Ваш ответ на вопрос