为什么我可以访问存储在抽象类型集合中的特定结构的属性?
Why can I access the attribute of a specific struct when it's stored in a collection of abstract types?
abstract type Elf end
struct LightElf <: Elf
name::String
life::Int32
end
struct DarkElf <: Elf
name::String
life::Int32
# This attribute is only in DarkElf.
enchantment::Int32
end
amber = LightElf("Amber",100)
charles = DarkElf("Charles",20,45)
elves = Elf[]
push!(elves,amber,charles)
charles = DarkElf("Charles",20,45)
println(elves[2].enchantment)
> 45
为什么我可以从 charles
访问存储在抽象数组 Elf
objects 中的 enchantment
字段?
在像 C#
或 Java
这样的语言中,parent 不知道该子 class 的任何特定属性。显然,我们没有 abstract
classes,所以我们不知道哪些属性会生成泛型 Elf
。我想你可能会问,Julia 是如何知道 struct
?
中的属性的?
这里的答案是,Julia 本质上是一种动态语言,而像 C# 和 Java 这样的语言本质上是静态的。在 Julia(和大多数动态语言)中,变量没有类型。对象做。当你在静态语言中取 elves[2]
时,你会得到一个 Elf
类型的变量。当你这样做是 Julia 时,你会得到一个 DarkElf
.
abstract type Elf end
struct LightElf <: Elf
name::String
life::Int32
end
struct DarkElf <: Elf
name::String
life::Int32
# This attribute is only in DarkElf.
enchantment::Int32
end
amber = LightElf("Amber",100)
charles = DarkElf("Charles",20,45)
elves = Elf[]
push!(elves,amber,charles)
charles = DarkElf("Charles",20,45)
println(elves[2].enchantment)
> 45
为什么我可以从 charles
访问存储在抽象数组 Elf
objects 中的 enchantment
字段?
在像 C#
或 Java
这样的语言中,parent 不知道该子 class 的任何特定属性。显然,我们没有 abstract
classes,所以我们不知道哪些属性会生成泛型 Elf
。我想你可能会问,Julia 是如何知道 struct
?
这里的答案是,Julia 本质上是一种动态语言,而像 C# 和 Java 这样的语言本质上是静态的。在 Julia(和大多数动态语言)中,变量没有类型。对象做。当你在静态语言中取 elves[2]
时,你会得到一个 Elf
类型的变量。当你这样做是 Julia 时,你会得到一个 DarkElf
.