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
将如预期的那样引发错误。
是否可以定义抽象静态方法?
我正在尝试:
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
将如预期的那样引发错误。