【发布时间】:2019-06-11 01:54:42
【问题描述】:
我一直在尝试理解 Julialang 的类型系统,但一些设计方面仍然让我感到困惑。我希望有人能澄清一下。
所以这里的问题是关于抽象类型及其具体实现。从我understandJulia 来看,抽象类型不会对其具体实现施加任何约束。因此,不能保证适用于 Abstract 类型的方法将适用于该类型的具体实现。
我知道 Julia 不使用类或遵循继承。但我只是想避免在我的代码中产生各种错误。如果有不同的设计范式,那么有人可以回答下面的问题 2。
所以我有 2 个问题。
这仍然是该语言的工作方式吗?只是为了确认自博客文章以来没有任何变化。
用户如何围绕这个看似漏洞设计他们的软件?
链接帖子中的问题示例:
abstract type AbstractPerson end
abstract type AbstractStudent <: AbstractPerson end
abstract type AbstractTeacher <: AbstractPerson end
struct Person <: AbstractPerson
name::String
end
struct Student <: AbstractStudent
name::String
grade::Int
hobby::String
end
struct MusicStudent <: AbstractStudent
grade::Int
end
现在,如果我在抽象类型上创建一些方法。
get_name(x::AbstractPerson) = x.name
p1 = Person("elroy")
get_name(p1)
>"elroy"
所以即使MusicStudent 是AbstractPerson 的子类型,MusicStudent 也没有name 属性。这意味着观察到跟随行为。
m1 = MusicStudent(10)
get_name(m1)
ERROR: type MusicStudent has no field name
Stacktrace:
[1] getproperty(::Any, ::Symbol) at ./sysimg.jl:18
[2] get_name(::MusicStudent) at ./In[2]:1
[3] top-level scope at In[13]:2
所以这里的问题是Julia 允许我用一个不完整的构造函数来实例化类型变量m1。当我尝试运行该功能时,它只会给我一个错误。
也就是说,如果我为抽象类型编写函数,我不能保证该类型的每个具体实现都具有相同的接口。这似乎会使代码变得非常脆弱,因为开发人员不知道哪些类型实现了哪些属性和方法。
【问题讨论】:
标签: julia