閉包是個神奇的東西,有很多奇妙地用法,用它可以來模擬實現OO 的一些功能。以下代碼用閉包和消息傳遞的方法實現了OO 繼承,重寫。有興趣可以看看Lisp CLOS 的實現方法,參考用來模擬實現另外一種Perl OO。可以看看Meta programming,Mouse 的OO 實現部分,相信會對你有很大的幫助。
sub shape {
(my $newx, $newy) = @_;
return sub{
my ($method, @param) = @_;
if($method eq 'getx'){
$newx
}
elsif($method eq 'gety'){
$newy
}
elsif($method eq 'setx'){
$newx = $param[0];
}
elsif($method eq 'sety'){
$newy = $param[1];
}
elsif($method eq 'moveto'){
($newx, $newy) = @param
}
elsif($method eq 'draw'){
"$newx, $newy"
}
else{
die "bad method";
}
}
}
sub circle {
(my $newx, $newy, $newz) = @_;
my $super = shape $newx, $newy;
return sub {
my ($method, @param) = @_;
if($method eq 'getz'){
$newz
}
elsif($method eq 'setz'){
$newz = $param[0];
}
elsif($method eq 'moveto'){
$super->('moveto', @param);
$newz = $param[2];
}
elsif($method eq 'draw'){
$super->('draw').", $newz"
}
else{
$super->(@_);
}
}
}
$y = circle 100,200,300;
$y->('setx',120);
$y->('setz',320);
$y->('moveto',500,987,600);
print $y->('draw');