mv3*_*mv3 10 inheritance julia
假设我在Julia中的抽象类型A上定义了一个函数:
abstract A
function mysum(a::A)
a.x + a.y
end
Run Code Online (Sandbox Code Playgroud)
隐式地,任何子类型都应该具有字段x和y,以使此函数起作用.因此,在A上定义的函数是为子类型设置的要求.这些功能可以在任何地方编写,人们可以想象这样的情况,即功能要复杂得多,而且要求更难以发现. 有没有什么方法可以声明一个抽象类型的子类型除了函数隐式之外必须具有的类型?
这似乎与朱莉娅#6975有关,但如果与此无关,那么有人可以澄清差异.
最后,为什么有人想要使用类型联合而不是抽象类型. 抽象类型更灵活,可扩展,类型联合是固定的.例如
为什么这个:
type A
x
end
type B
x
end
typealias C Union{A,B}
Run Code Online (Sandbox Code Playgroud)
而不是这个:
abstract C
type A <: C
x
end
type B <: C
x
end
Run Code Online (Sandbox Code Playgroud)
第一个问题:我认为目前没有办法实现这一目标,但它是关于在语言中添加特征的讨论的核心.你已经发现了一个讨论这个问题的问题,我相信它是在1.0版之后的非正式路线图上(至少我已经看过它了.)
我认为实现你正在寻找的东西的推荐方法是这样的:
abstract A
type B <: A
x
y
end
type C <: A
w
z
end
prop1(b::B) = b.x
prop2(b::B) = b.y
prop1(c::C) = c.w
prop2(c::C) = c.z # changed from prop2(c::C)=c.w
mysum(a::A) = prop1(a) + prop2(a)
Run Code Online (Sandbox Code Playgroud)
也就是说,您可以实现定义其行为的方法,而不是要求B
并C
拥有相同的字段.然后,实际字段名称仍然是每种具体类型的内部实现细节.
对于联合类型,可以使用它们(除其他外)将方法添加到没有共同超类型的类型.抽象类型很好,但是您不能总是将所有类型都塞进一个公共层次结构中,并且通常会将方法添加到您自己未定义的类型集合中.
归档时间: |
|
查看次数: |
2677 次 |
最近记录: |