【问题标题】:Crystal: abstract static methodCrystal:抽象静态方法
【发布时间】:2017-01-14 14:34:32
【问题描述】:

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

我正在尝试:

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

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

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

    abstract class Something
      module ClassMethods
        abstract def some_abstract_class_method
      end
    
      extend ClassMethods
    
      abstract def some_abstract_instance_method
    end
    

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

    在不实现类方法some_abstract_class_method的情况下实现这个类会引发错误,正如预期的那样。

    【讨论】:

      【解决方案2】:

      抽象类方法似乎不是语言特性:

      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"
      

      【讨论】:

      • 实例方法加单例是一种解决方法,但它可能是一种解决方案
      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2011-02-25
      • 1970-01-01
      • 2011-03-19
      • 2012-04-05
      • 2021-10-16
      相关资源
      最近更新 更多