【发布时间】:2017-02-05 23:43:43
【问题描述】:
给定一个模块中的以下接口:
module Action
abstract def perform
end
我想用它来实例化实现它的不同类:
class Run
include Action
def perform
puts "run!"
end
end
class Jump
include Action
def perform
puts "jump!"
end
end
我知道可以定义像 [] of Action 这样的数组并能够存储 Action 的实例,但我对类而不是实例感兴趣。
我想知道如何定义类型限制,以便我可以存储对实现接口而不是特定实例的类的引用。
我的目标是能够实例化某个类的新实例并能够在其中调用perform 方法。
此时可以编写如下代码:
actions = [Run, Jump]
actions.each do |klass|
instance = klass.new.as(Action)
instance.perform
end
一切都会奏效,但是由于类型限制更加严格,因此无法将该类列表存储到实例变量中。
这种情况的类型限制语法是什么?
【问题讨论】:
-
每次都实例化一个新实例而不是使用同一个实例的原因是什么?
-
@asterite 开发人员可能正在更改执行中的实例变量。跨多个光纤/线程调用它可能会导致问题。 AFAIK 一个新的实例是最好的方案。
标签: type-inference crystal-lang