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