为什么在Julia中使用抽象类型关键字?

时间:2016-03-28 17:36:55

标签: inheritance julia abstract

朱莉娅的“抽象类型”的目的是什么?除了使用继承层次结构的类型之外还有用处吗?

abstract Animal

type Dog <: Animal
  sound
  color
end

type Bird <: Animal
  sound
  color
end

如果它不能继承属性和方法,那么它的目的是什么?

3 个答案:

答案 0 :(得分:9)

可能值得reading through the manual,因为它们有很多用途。

从手册中引用一个例子:

  

抽象类型允许构建类型层次结构,提供具体类型可以适合的上下文。例如,这允许您轻松地编程为任何整数类型,而不会将算法限制为特定类型的整数。

答案 1 :(得分:1)

你说

<块引用>

如果它不提供继承属性和方法的能力?

但我不同意这个观点。

如果您认为 abstract type 就像 Java 中的抽象类,那充其量可能是微不足道的。首先将它们视为接口。假设我们想要一个接口 Named,用于任何具有合理名称概念的东西。

abstract type Named end
nameof(::Named) = ""

如果您真的想要,如果没有合理的默认值,您可以在 nameof 中抛出异常。

现在,任何人都可以加入并订阅该界面。

struct Person <: Named
  name :: String
end
nameof(p::Person) = p.name

现在,假设我们想说一些有关实体的信息,该实体可能有名称也可能没有名称。如果名称存在,我们可以使用该名称,如果不存在则退回

message(entity, msg::String) = print(nameof(entity), " says ", msg)
message(entity::Named, msg::String) = print(nameof(entity), " says ", msg)

因此您应该将 abstract type 视为类似于 Java 接口但可扩展,因此我们可以为现有类型“实现”该接口,例如内置类型和我们无法控制的类型。一个类型订阅了接口,它大概定义了一个最小的函数集,然后其他几个函数作用于该接口,自动扩展以适用于选择加入该行为的任何类型。

答案 2 :(得分:-1)

您可以强制关联以防止意外混合类型。确保鸟类不会吃狗食,并且确保两种动物都不会接受用于植物的肥料,例如。

另一个例子:以美元开具发票的公司与以欧元开具发票的公司。如果操作得当,您就不会意外添加美元和欧元。

abstract type Currency end

struct dollar <: Currency
    amazon
    apple
end

struct euro <: Currency
    adidas
    mercedes
end