abstract メソッド
Mojo.pmを見ていて、Perlでもabstract(抽象)メソッドとして定義する方法が分かったのでメモ。
まあ厳密には違うのだけれども。
親となるクラス内で、
sub handler { croak 'Method "handler" not implemented in subclass' }
このように死ぬだけのサブルーチンをつくっておけばよい。
これだけで、少なくともこの親クラスを継承して、このサブルーチンを使用する子クラスは定義せざるを得なくなる。
(実装せずに使ったら親クラスの死ぬだけのサブルーチンが呼ばれちゃうのだものね)
(ファクトリメソッドパターンというのかな?)
ただし、これだけではPHPのようなabstractメソッドはできない。
PHPだとabstractなクラスのabstractなメソッドは、子クラス側で実装していなければ、起動時に死ぬ。
<?php abstract class Oya { abstract function ok(); } class Ko extends Oya { function ng() { print "ng\n"; } } $ko = new Ko(); $ko->ok(); $ko->ng(); ?>
Fatal error: Class Ko contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Oya::ok)
Perlでこういう動きは出せないか。