削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎superclass と subclasses: Crystal には、RubyのClassにあるメソッド superclass と subclasses がないので、マクロで実装しました。
タグ: 2017年版ソースエディター
476 行
</syntaxhighlight>
: crystal の tool hierarchy サブコマンドで、クラスの継承関係がわかります。
 
===== superclass と subclasses =====
Crystal には、RubyのClassにあるメソッド superclass と subclasses がないので、マクロで実装しました。
;superclass と subclasses:<syntaxhighlight lang=crystal line>
class Class
def self.superclass
{{ @type.superclass }}
end
 
def self.subclasses : Array(self.class)
{{ @type.subclasses }}.map(&.as(self.class))
end
 
def self.all_subclasses : Array(self.class)
{% begin %}
[{{ @type.all_subclasses.join(",").id }}] of self.class
{% end %}
end
end
class A end
class AA < A end
class AAA < AA end
class AAB < AA end
class AB < A end
 
p! A,
A.subclasses,
A.all_subclasses,
AAA.superclass,
A.superclass
c = AAA
while !c.is_a? Nil
p! c.superclass
c = c.superclass
end</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
A # => A
A.subclasses # => [AA, AB]
A.all_subclasses # => [AA, AAA, AAB, AB]
AAA.superclass # => AA
A.superclass # => Reference
c.superclass # => AA
c.superclass # => A
c.superclass # => Reference
c.superclass # => Object
c.superclass # => nil
</syntaxhighlight>
 
==== 抽象クラス ====