假设我在Julia中的抽象类型A上定义了一个函数:
abstract A
function mysum(a::A)
a.x + a.y
end
隐式地,任何子类型都应该具有字段x和y,以使此函数起作用。因此,在A上定义的函数是为子类型设置的要求。这些功能可以在任何地方编写,人们可以想象这样的情况,即功能要复杂得多,而且要求更难以发现。 是否有某种方式声明要求抽象类型的子类型必须具有除函数隐式之外的其他类型?
这似乎与Julia#6975有关,但如果与此无关,可能会有人澄清差异。
最后,为什么有人想要使用类型联合而不是抽象类型。抽象类型更灵活,可扩展,类型联合是固定的。例如
为什么:
type A
x
end
type B
x
end
typealias C Union{A,B}
而不是:
abstract C
type A <: C
x
end
type B <: C
x
end
答案 0 :(得分:9)
第一个问题:我认为目前没有办法实现这一目标,但它是关于在语言中添加特征的讨论的核心。你已经发现了一个讨论这个问题的问题,我相信它是在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)
也就是说,您需要实现定义其行为的方法,而不是要求B
和C
具有相同的字段。然后,实际的字段名称仍然是每种具体类型的内部实现细节。
对于联合类型,可以使用它们(除其他外)将方法添加到没有共同超类型的类型。抽象类型很好,但是你不能总是把所有类型都塞进一个公共层次结构中,而且你经常会将方法添加到你自己没有定义的类型集合中。