2016-10-06 13 views
0

の継承を強制I持っているいくつかの他のモジュール(例えばバン、リムジン、コンバーチブル、...)の基底クラスであることを意味するPerlパッケージ(例えば車) -たPerl:モジュール

use base ("car"); 

バンのpmファイルで...

車が使用されていないことを確認する必要があります - 継承されたオブジェクト(van、limo、...)の使用のみが許可されています。

今日は、基底クラスの内部でref()を実行するとします。それは "車"の名前を返した場合、私はそれが継承なしで使用されていることを知っていると私はエラーで終了します。

もしバン、...使用されているREF()

はそれを行うために、よりエレガント/静的な方法があります...、「バン」を返します。私は文法エラーのようなものを得る方法を言うことができますか?

そして、いや:ここ はサンプルです:私は編集

;-)

OO-の言語に比べOO-トピックでのPerlの弱点を議論するために好きではありません。できます。

car :: newのチェックを行うより良い方法は、問題です。

#---------car.pm---------- 
package car; 

sub new 
{ 
    my $class = shift; 
    my $self = {}; 
    bless ($self, $class); 

    if(ref($self) eq "car") # thats my check to make sure beep exists 
    { die "no allowed because no beep here"; 
    } 

    $return $self; 
} 

sub honk 
{ beep(); # only defined in the inherited class (van, ...) 
} 

1; 


#----van.pm----- 
package van; 

use car; 
use base ("car"); 

sub beep 
{ 
    print "tuuuut"; 
} 
1; 

#---------main.pl--------- 
car->new()->honk(); # dies 
# if no ref-check it would crush because no beep in car. 

van->new()->honk(); # ok but maybe not most elegant 
+0

私はあなたがしようとしていることを十分に理解していません。あなたは今、あなたが今やっていることの例を含んでいて、あなたがそれを好まない理由をもう少し説明することができますか? – simbabque

+0

@simbabque:私は彼が仮想基本クラス(別名抽象クラス)を作成しようとしていると思います。 Schwernの[Class :: Virtual](https://metacpan.org/release/Class-Virtual)には、役に立つアイデアがいくつかあります。 –

+0

@DaveCross Club Sandwich。 – simbabque

答えて

5

あなたのコードは表示されませんが、正しい場所にチェックインしていないようです。

sub new { 
    my ($class, @other_args) = @_; 
    if ($class eq __PACKAGE__) { 
     Carp::croak "must be subclassed"; 
    } 

しかし、いいえ、コンパイル時にそれを行う方法はありませんが、コンストラクタでこれを行う必要があります。

+0

これは、どのサブクラスもコンストラクタを完全にオーバーライドしないことを前提としています。それは起こりそうもないが不可能ではない。 –

+0

@DaveCrossコンストラクタをオーバーライドすると、それらはサブクラスであり、問​​題はありません。 – ysth

+1

D'oh!はい。私は今日特に愚かな気分です: -/ –

関連する問題