2017-01-14 115 views
2

是否可以定義抽象靜態方法?晶體:抽象靜態方法

我想:

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

回答

1

抽象類的方法不會出現是一個語言特性:

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" 
+0

實例方法加單例是一種解決方法,但它可能是一種解決方案 – Mat

0

我面臨同樣的問題,並找出了一個(在我看來)更好的解決方案:

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將按照預期發出錯誤。