Perlではメソッドのオーバーロードが出来ない様ですね。まぁこんなだけ変数の型にゆるゆるだったら、出来るわけもないのかと思ったりもしますが、、、
代替策としてこんなのがあるみたい。
私としては、まとまってていいなーって感じです。
Triangle.pm
package Triangle;
use Carp qw(croak);
my $subSpace = sub {
        my($a,$b,$c) = @_;
        my $s = ($a + $b + $c) / 2;
        my $inRoot = $s * ($s - $a) * ($s - $b) * ($s - $c);
        if ($inRoot >= 0){
                return sqrt($inRoot);
        }else{
                croak "you cannot construct the triangle with the sides $a, $b, $c !";
        }
};
sub new{
        my ($class,$a,$b,$c) = @_;
        bless{a=>$a, b=>$b,c=>$c, s=>$subSpace->($a,$b,$c)};
#       my $self = {a=>$a, b=>$b, c=>$c};
#       bless $self, $class;
#       return $self;
}
sub space{
        my ($self) = shift;
        warn "You are about to calculate the space of ", ref($self), "!!!\n";
        return $self->{s};
}
sub getSides{
       my $self = shift;
       return ($self->{a}, $self->{b}, $self->{c});
}
sub setSides{
       my ($self, $a, $b, $c) = @_;
       $self->{a} = $a;
       $self->{b} = $b;
       $self->{c} = $c;
       $self->{s} = $subSpace->($a,$b,$c);
}
1;
このgetter setterの部分を、同じメソッド名にして、それぞれ引数の数に応じて呼ぶモジュールを変えます。
Triangle.pm~その2~
sub sides{
        my $self = shift; # invocant
        unless (@_) { # getter
                return ($self->{a}, $self->{b}, $self->{c}); # return properties
        } else { # setter
                my ($a, $b, $c) = @_;
                # get values from arguemnts and set properties
                $self->{a} = $a;
                $self->{b} = $b;
                $self->{c} = $c;
                $self->{s} = $subSpace->($a,$b,$c);
        }
}
モジュールはこんなもんで、あとはコレを呼ぶ側で、呼ぶメソッドをsetSides, getSidesからそれぞれsidesに統一したら完了です。
呼ぶ側のコードの例はこんな感じです。
triangleSpace.pl
# ! /bin/perl -w
use Triangle;
my $tri = Triangle->new(3,4,5);
my $space = $tri->space;
print "sides are ", join(",",$tri->sides), ". \n";
print "Triangle is ",$tri," and its space is ",$space,"\n";
my ($a,$b,$c) = $tri->sides;
$tri->sides($a,$b,$c);
$space = $tri->space;
print "sides are ",join(", ",$tri->sides), ". \n";
print "Triangle is ",$tri," and its space is ",$space,"\n";
同じ結果になっていることを確認して頂けたでしょうか?
めんどいんだかなんだかわかりませんが、こんなやり方も出来るんですね~ 勉強になりました。