Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

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でこういう動きは出せないか。