Crystal: 抽象静态方法

Crystal: abstract static method

是否可以定义抽象静态方法?

我正在尝试:

abstract struct MyStruct
  abstract def self.myfun  # ERR
  abstract def MyStruct::myfun  # ERR
end

抽象 class 方法似乎不是语言功能:

abstract class Abstract
  abstract self.doit
end
# => Syntax error in /home/bmiller/test.cr:23: unexpected token: self

但是你总是可以委托给一个实例:

abstract class Parent
  def self.instance
    @@instance ||= new
  end

  def self.doit
    instance.doit
  end

  abstract def doit
end

class Child < Parent
  def doit
    "ok"
  end
end

p Parent.doit # => can't instantiate abstract class Parent
p Child.doit # => "ok"

我遇到了同样的问题并想出了一个(在我看来)更好的解决方案:

abstract class Something
  module ClassMethods
    abstract def some_abstract_class_method
  end

  extend ClassMethods

  abstract def some_abstract_instance_method
end

文档提到 模块方法 也可以抽象,所以这是建立在它之上的。

在不实施 class 方法的情况下实施此 class some_abstract_class_method 将如预期的那样引发错误。