闭包是个神奇的东西,有很多奇妙地用法,用它可以来模拟实现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');