朱莉娅的“抽象类型”的目的是什么?除了使用继承层次结构的类型之外还有用处吗?
abstract Animal
type Dog <: Animal
sound
color
end
type Bird <: Animal
sound
color
end
如果它不能继承属性和方法,那么它的目的是什么?
答案 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