比如我有这样一个 struct
struct A
X
T
end
我想要让 X
被隐藏以来,供开发者使用,用户只要调用 T
(和 X
取值一样)就可以了。
比如我有这样一个 struct
struct A
X
T
end
我想要让 X
被隐藏以来,供开发者使用,用户只要调用 T
(和 X
取值一样)就可以了。
没有类的专有方法,如何才能支持私有变量。
对于一个struct,无论是开发者还是用户,在调用的他的时候是对等的,难不成私有变量后面加个只有开发者知道暗号?
要不然像python一样弄个约定俗成加’__'.
Julia对象有没有类似Java c++那样的私有属性不允许外部修改的。比如定义一个类型,有些属性不给外部修改。
试试这个?
更新到 1.0 : type
改 mutable struct
Java-likeClass.jl
mutable struct 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
用法同 sf
julia> function Person(name, age)
getName() = name
getAge() = age
getOlder() = (age+=1)
()->(age;getName;getAge;getOlder)
end
Person (generic function with 1 method)
julia> o = Person("bob", 26)
#36 (generic function with 1 method)
julia> o.age
Core.Box(26)
julia> o.name
ERROR: type ##36#40 has no field name
Stacktrace:
[1] getproperty(::Any, ::Symbol) at .\sysimg.jl:18
julia> o.getName()
"bob"
julia> o.getAge()
26
julia> o.getOlder()
27
julia> o.getAge()
27
julia> typeof(o)
getfield(Main, Symbol("##36#40")){getfield(Main, Symbol("#getName#37")){String},getfield(Main, Symbol("#getAge#38")),getfield(Main, Symbol("#getOlder#39"))}
将部分成员封装在一个immutable里面,外部就无法修改了。但是依然可以访问。例如
mutable struct 你的Class
_某个private::Private成员
别的可以修改的成员
end
struct Private成员
a
b
c
end
我只是举个例子,别用这种风格写代码哈。