Inheritance Julia中的抽象类型与继承

Inheritance Julia中的抽象类型与继承,inheritance,julia,Inheritance,Julia,假设我在Julia中的抽象类型a上定义了一个函数: abstract A function mysum(a::A) a.x + a.y end 隐式地,任何子类型都应该具有字段x和y,以便此函数工作。因此,定义在子类型上的函数设置了子类型的要求。这些函数可以在任何地方编写,人们可以想象这样一种情况:函数更复杂,需求更难发现除了隐式地从函数中声明一个抽象类型的子类型必须具备的要求外,还有什么方法可以声明吗? 这似乎与此有关,但如果与此无关,有人可以澄清区别 最后,为什么会有人想使用类型联合而

假设我在Julia中的抽象类型a上定义了一个函数:

abstract A
function mysum(a::A)
  a.x + a.y
end
隐式地,任何子类型都应该具有字段x和y,以便此函数工作。因此,定义在子类型上的函数设置了子类型的要求。这些函数可以在任何地方编写,人们可以想象这样一种情况:函数更复杂,需求更难发现除了隐式地从函数中声明一个抽象类型的子类型必须具备的要求外,还有什么方法可以声明吗?

这似乎与此有关,但如果与此无关,有人可以澄清区别

最后,为什么会有人想使用类型联合而不是抽象类型。抽象类型更灵活、更可扩展,类型联合是固定的。比如说

为什么会这样:

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
抽象C

类型A第一个问题:我认为目前没有办法做到这一点,但这是关于在语言中添加特征的讨论的核心。您已经发现了一个讨论这个问题的问题,我相信这是在1.0版之后的非正式路线图上(至少我已经提到过)

我认为实现您想要的东西的推荐方法是这样的(请注意,
type
已被弃用,并被
struct
取代):

摘要A

结构B第一个问题:我认为目前没有办法做到这一点,但这是关于向语言中添加特征的讨论的核心。您已经发现了一个讨论这个问题的问题,我相信这是在1.0版之后的非正式路线图上(至少我已经提到过)。可以使用联合类型(除其他外)向没有公共超类型的类型添加方法。抽象类型很好,但您不能总是将所有类型都固定到一个公共层次结构中,而且您经常会将方法添加到您自己没有定义的类型集合中。@DNF谢谢,这澄清了我的困惑!如果你想把它作为一个答案写下来,我很乐意接受。请把它分成两个问题。@Oxiabox它已经回答了,你想让我再回答两个问题吗?@mikev3这一次不行,不值得(我在没有刷新页面的情况下写了那条评论)。但对于未来的问题,最好把它们分开。这意味着,如果有人能很好地回答其中一部分,但另一部分回答得很差,他们就不会陷入困境。它让每一篇文章都保持着焦点。这正是我想知道的,谢谢!如果B和C共享相同类型的信息,但字段名不完全相同,那么如何实现一个通用方法?您已清除此项。+1用于使用方法访问字段。我做了一个错误的假设,假设我所需要的抽象类型的每一个子类型都有相同的核心5个字段以相同的方式实现,再加上一些其他字段。这被证明是错误的,并使我的代码难看。现在,我认为访问被声明为am抽象类型的某个对象的字段是一个反模式。(正在谈论为其添加Lint.jl规则)@DNF,除非我弄错了,否则它看起来与Scala、Rust或Haskell中的类型类非常相似。函数
prop1
prop2
是类型类,方法
prop1(b::b)
prop1(c::c)
等是这些类型类的实现,这大致正确还是我没有理解?
abstract A

struct B <: A
    x
    y
end

struct 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)