在Julia中创建非常相似的类型

tln*_*agy 5 julia

假设我有两种类型,它们都是抽象类型的子类型

abstract A

type B <: A
x
y
z
end 

type C <: A
x
y
z
w
end
Run Code Online (Sandbox Code Playgroud)

是否有任何创建方法,C而不必基本上复制/粘贴B和添加额外的参数?主要问题是,B并且C非常接近,我希望尽可能少的代码重复.我知道手册说具体类型不能相互进行子类型化:

Julia的类型系统的一个特别显着的特征是具体类型可能不会相互进行子类型化:所有具体类型都是最终的,并且可能只有抽象类型作为其超类型.

有没有办法解决?

spe*_*on2 9

在这些情况下,我通常喜欢谱写我的类型.

这是我的意思的一个例子:

abstract A

type B <: A
    x
    y
    z
end 

type C <: A
    b::B
    w
end
Run Code Online (Sandbox Code Playgroud)

请注意,C它仍然是子类型A,但包含B一个字段实例.

更新

确实,您无法再访问c.x,而是必须这样做c.b.x.有一个简单的方法来解决这个问题.

假设你有一个功能

function my_func(a::A)
    # do something with a.x, a.y, a.z
end
Run Code Online (Sandbox Code Playgroud)

如果my_func应该使用任何子类型A,它只能访问所有子类型中共同的字段A.在这种情况下,即x,yz.

知道了,我还会定义一个特定版本的方法来调度实例,C如下所示:

my_func(c::C) = my_func(c.b)
Run Code Online (Sandbox Code Playgroud)

这有点冗长,但您可以轻松地将所有这些函数包装在一个元编程for循环中,该循环使用@eval并一次性生成它们.有关详细信息,请参阅文档