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?