Crystal 中的界面

interfaces in Crystal

是否可以在 Crystal 编程语言中使用接口的概念?

接近的是模块,但它们似乎主要用于(和设计)名称空间处理?

所以问题更倾向于 Golang 风格的界面。

您可以使用abstract

abstract class Animal
  abstract def talk
end

class Dog < Animal
  def talk # You must implement talk
    "Woof!"
  end
end

class Person
  getter pet

  def initialize(@name : String, @pet : Animal)
  end
end

john = Person.new "John", Dog.new

john.pet.talk # => "Woof!"

Crystal Docs: Virtual and Abstract Types

模块用于创建命名空间层次结构,但这并不是它们最初的用途(嵌套 类 也创建层次结构)。

模块意味着混合,将实现可以在不同 类(或模块)中共享的方法分组。模块也可以包含抽象方法,其实现是特定的。

模块明确包含在 类 中,您可以限制模块名称的类型,因此它们可以作为接口。

如果您创建一个只有抽象方法的模块,那么纯接口是可能的。