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 が提供するメソッド

Ref.