17

Perl の OO モデルがかなり原始的であることは理解しています。ほとんどの点で、これは本質的に名前空間のハッキングです。

とはいえ、「インターフェース」のようなものを作ることはできないのだろうか。私の目標は、それらのサブクラスによる特定のメソッドの実装を必須にすることを主な目的とする他​​のクラスを拡張する基本クラスを作成することです (名前は問題ありません。署名は必要ありません)。それが「純粋な仮想」クラス (Java の「インターフェース」など) であるか、スーパークラス内のこれらのメソッドの実際の実装スタブを備えた具象クラスであるかはあまり気にしませんが、私が望むのは、サブクラスは、スーパークラスの特定のメソッドを実装します。

これは可能ですか?もしそうなら、どのように?

4

6 に答える 6

30

Mooseを使用した回答は次のとおりです...

package Comparable;
use Moose::Role;

requires 'eq';

package Person;

has size => (
    is   => 'ro',
    does => 'Comparable',
);

size 属性は、Comparable "interface" を実装するオブジェクトでなければなりません。Moose-land では、インターフェイスはロールであり、ロールは単なるインターフェイス定義以上のものになる可能性があります。

于 2009-07-02T13:23:37.737 に答える
11

どのように実装できるかわかりません。ただし、「Perl 5 のポストモダン オブジェクト システム」であるMooseを見てください。

于 2009-07-02T04:15:19.223 に答える
6

基本クラスの関数/サブルーチンの実装/オーバーロードを強制するという全体的な考え方は、Perl にとっては異質なものだと思います。どの時点で強制メカニズムが機能すると思いますか?

実行時にこれを行うことに問題がなければ、基本クラスの実装が呼び出されると死ぬ可能性があります。

編集: 実際には、はい、Class::Contract が進むべき道のようです。

于 2009-07-02T04:23:00.990 に答える
6

Class::Contractはこれに役立ちます。コンパイル時のコントラクト チェックをサポートします。

于 2009-07-02T04:23:47.480 に答える
2

私は「互換性」と呼んでいる軽量のパターンを持っており、クラスが Perl でインターフェイスを実装しているかどうかを示すのはどのくらい重要ですか?への回答で説明しています。

に擬似パッケージを貼り付けるだけの問題です@ISA:

our @ISA = qw<... X::Compatible ...>;

彼らが期待することをしなければ、彼らのコードを壊してしまいますX。実際には、再利用する文書化された動作がたくさんありますが、X::Compatibleそれが期待どおりに機能することを保証するために使用するのは、それがそうであることを示すクラスです。

perl 5.10でこのDOES概念が導入されたので、これはほぼ軽量であり、オブジェクトは、そこにあるものすべてを探して肯定に応答することによって、基本を実装するX::Compatible基本クラスから継承します。アイデアは次のとおりです。Object::CompatibleDOES@ISA/::Compatible$/

$object->DOES( $x ) == $object->isa( $x . '::Compatible' )
于 2009-07-02T14:52:11.830 に答える
1

実行時にエラーを作成する単純なソリューション:

package SomeVirtualClass;

use strict;
use warnings;

use Carp;

sub some_method { croak "virtual method some_method not overridden" }
于 2009-07-02T04:21:06.793 に答える