gpt4 book ai didi

oop - 如何在 julia 中创建一个 "single dispatch, object-oriented Class",其行为类似于具有公共(public)/私有(private)字段和方法的标准 Java 类

转载 作者:行者123 更新时间:2023-12-03 21:17:43 24 4
gpt4 key购买 nike

我在一本书中读到“你不能在 julia 中使用像 obj.myfunc() 这样的单调度方法创建传统的‘类’”……我认为这听起来更像是一个挑战而不是事实。

所以这是我的JavaClass使用公共(public)/私有(private)字段和方法键入只是为了在 Julia 中出现像这样丑陋的东西的纯粹震惊和恐怖因素,毕竟开发人员已经竭尽全力避免它:

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

本质上,构造函数变成了一个闭包,这就是创建“私有(private)”字段和方法/重载的方式。
有什么想法吗? (除了“天哪,为什么???你为什么要这样做??”)
还有其他方法吗?
你能想象到什么情况下这可能会严重失败?

最佳答案

Jeff Bezanson's answer很好,但是正如评论中提到的那样,字段可能会被装箱,这很烦人。
这个问题有一个更好的解决方案。
备选方案 1(与问题中提出的方法基本相同):

# Julia
mutable struct ExampleClass
field_0
field_1
method_0
method_1
method_2

function ExampleClass(field_0, field_1)
this = new()

this.field_0 = field_0
this.field_1 = field_1

this.method_0 = function()
return this.field_0 * this.field_1
end

this.method_1 = function(n)
return (this.field_0 + this.field_1) * n
end

this.method_2 = function(val_0, val_1)
this.field_0 = val_0
this.field_1 = val_1
end

return this
end
end

ex = ExampleClass(10, 11)
ex.method_0()
ex.method_1(1)
ex.method_2(20, 22)
备选方案 2:
mutable struct ExampleClass
field_0
field_1

function ExampleClass(field_0, field_1)
this = new()

this.field_0 = field_0
this.field_1 = field_1

return this
end
end

function Base.getproperty(this::ExampleClass, s::Symbol)
if s == :method_0
function()
return this.field_0 * this.field_1
end
elseif s == :method_1
function(n)
return (this.field_0 + this.field_1) * n
end
elseif s == :method_2
function(val_0, val_1)
this.field_0 = val_0
this.field_1 = val_1
end
else
getfield(this, s)
end
end

ex = ExampleClass(10, 11)
ex.method_0()
ex.method_1(1)
ex.method_2(20, 22)
备选方案 1 看起来更好,但备选方案 2 表现更好。
我对此事进行了更深入的分析,您可以在这里查看: https://acmion.com/blog/programming/2021-05-29-julia-oop/

关于oop - 如何在 julia 中创建一个 "single dispatch, object-oriented Class",其行为类似于具有公共(public)/私有(private)字段和方法的标准 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39133424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com