Wie erstelle ich eine "single dispatch, object-oriented Class" in julia, die sich wie eine Java-Standardklasse mit öffentlichen / privaten Feldern und Methoden verhält?

Ich habe in einem Buch gelesen, dass "man mit Single-Dispatch-Methoden wie @ keine traditionellen 'Klassen' in Julia erstellen kanobj.myfunc() "... und ich dachte, das klingt eher nach einer Herausforderung als nach einer Tatsache.

Also hier ist meinJavaClass Geben Sie mit öffentlichen / privaten Feldern und Methoden nur für den schieren Schock- und Horrorfaktor ein, etwas Hässliches wie dieses in Julia zu haben, nach all den Schwierigkeiten, die die Entwickler gemacht haben, um es zu vermeide

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

Beispielgebrauch:

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

Im Wesentlichen wird der Konstruktor zu einem Closure, wodurch "private" Felder und Methoden / Überladungen erstellt werden. Irgendwelche Gedanken? (außer "OMG Warum ??? Warum würdest du das tun ??")
Alle anderen Ansätze?
Bei welchen Szenarien könnten Sie sich vorstellen, wo dies spektakulär scheitern könnte?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage