2016-07-01 3 views
3

Ist es in Perl möglich, eine Unterklasse zu erstellen, ohne einen Konstruktor zu implementieren? Ich brauche kein Unterklassen-spezifisches Konstruktorverhalten, deshalb möchte ich von dem Elternteil erben.Kann ich eine Perl-Unterklasse erstellen, ohne einen untergeordneten Konstruktor zu implementieren?

In diesem Beispiel habe ich eine Basisklasse Base.pm und eine Kindklasse Child.pm. Die Child Klasse einfach eine ihrer Eltern Methoden außer Kraft setzen sollte:

# test.pl 
use strict; 
use warnings; 
use Child; 

my $o = Child->new(); 
$o->exec(); 

-

# Base.pm 
package Base; 

sub new{ 
    my $self = {}; 

    bless $self; 
    return $self; 
} 

sub exec{ 
    my $self = shift; 
    die "I'm in the Base class\n"; 
} 

1; 

-

# Child.pm 
package Child; 

use Base; 
@ISA = ('Base'); 

sub exec{ 
    my $self = shift; 

    die "OVERRIDE in child\n"; 
} 

1; 

Als ich test.pl laufen, die exec Methode der Basisklasse bekommt ausgeführt (ich nehme an, es ist, weil das Objekt als Base im Base.pm Konstruktor gesegnet wird).

$ ./test.pl 
I'm the Base class 

Gibt es eine Möglichkeit, eine untergeordnete Klasse zu implementieren, ohne einen Konstruktor neu implementieren zu müssen?

+0

Siehe auch ['Vererbung - Schreibkonstruktoren in perlobj'] (http://perldoc.perl.org/perlobj.html#Writing-Constructors) – zdim

Antwort

7

Ja.

Sie haben effektiv die folgenden:

sub new { 
    return bless({}); 
} 

Ersetzen sie mit folgendem:

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

Grundsätzlich immer bless verwenden ‚s mit zwei Argumenten.


Wie schreibe ich meine Erbauer:

  • Basisklassen:

    sub new { 
        my ($class, ...) = @_; 
        my $self = bless({}, $class); 
        $self->{...} = ...; 
        return $self; 
    } 
    
  • Abgeleitete Klassen:

    sub new { 
        my ($class, ...) = @_; 
        my $self = $class->SUPER::new(...); 
        $self->{...} = ...; 
        return $self; 
    } 
    

Ich mag die Symmetrie.

Verwandte Themen