Perl 及び Ruby におけるMixin
Perl
Perl は言語として多重継承が可能です。
例えば Cafe
クラスが Shop
クラスを継承しつつ、 Spot
のメソッドも使いたい、
という場合には下記のように書くことができます。
package Cafe use strinct; use warnings; use parent qw(Spot Shop); ... 1;
NEXT
を使えば同名メソッドの呼び出し順の問題を
ある程度回避できるものの、やはり多重継承の持つ問題をすべて解消するものではありません。
というわけで Mixin
を利用して多重継承の便利さを享受しようと考えるわけですが、
これを Perl で行うためには Exporter
を使うのかなと思います。
package Shop; use strict; use warnings; our @EXPORT = qw(menu); sub menu { my $self = shift; return { coffee => 300, bread => 300, }; } 1;
package Spot; use strinct; use warnings; our @EXPORT = qw(location); sub location { my $self = shift; return 'shibuya'; } 1;
package Cafe; use strinct; use warnings; use Shop; use Spot; sub new { my ($class, $name) = @_; bless { name => $name }, $class; } 1;
Cafe
クラスはどのクラスも継承せず、代わりに use することで Shop
及び Spot
の持つメソッドを
import することで Cafe
のインスタンスメソッドとして利用することが可能になっています。
Ruby
Ruby における Mixin はクラスがモジュールを include
というものを使って継承することで実現しています。
Comparable
は大小比較機能を付与するモジュールです。
これを include
する例を下記に載せます。
class Foo include Comparable def <=>(rhs) #something good codes end end
Foo
から Comparable
のメソッドを利用できます。
foo1 = Foo.new foo2 = Foo.new food1 <= foo2 # Comparable が提供するメソッド