Thread Vererbung
(15 answers)
Opened by leo11 at 2009-06-29 20:00
Konstruktoren werden auf jeden Fall vererbt, denn ein Konstruktor ist auch nichts anderes als eine (Klassen-)Methode. Wenn also Y von X erbt, und Y keine eigenen Methoden hat, dann ruft Y->new die new-Methode von X auf.
Was meinst du mit "Attribute werden nicht vererbt"? Schreibt man einen Accessor für das Attribut "foo" in X, dann kann ein Objekt der Klasse Y selbstverständlich auch diesen Accessor aufrufen. Man kann sich das aber auch vereinfachen, indem man Class::Accessor, Moose o.ä. benutzt. Code (perl): (dl
)
1 2 3 4 5 6 7 package X; use base qw/ Class::Accessor /; X->mk_accessors( qw/ foo bar / ); ... package Y; use base 'X'; # nun hat auch Y die Attribute foo und bar Im Gegensatz zu use base qw/ CD::Music / hat ein use CD::Music gar nichts mit Vererbung oder OOP zu tun. Man muss zunächst einmal unterscheiden, ob man mit einem use auch Subroutinen importiert oder nicht. Ein use ist aber in jedem Fall nötig, um das Modul überhaupt zu laden. Es gibt Module wie z.b. File::Basename, von denen man einzelne nützliche Funktionen importieren kann: es geht aber theoretisch auch so: Ist natürlich mehr Schreibarbeit und erhöht sie Unlesbarkeit, sobald die Funktion mehrmals aufgerufen wird. Indem die Subroutine dirname in dein aktuelles Package importiert wird, könnte man es allerdings auch als Methode aufrufen, was aber nicht Sinn der Sache ist. Deswegen sollte man sparsam mit Importen sein. Alternativ dazu gibt es den Weg, den File::Spec geht: Alle "Subroutinen" werden hier einfach als Klassenmethoden aufgerufen. Das ist natürlich auch mehr Tipparbeit, aber IMHO schöner als File::Basename::dirname, weil es als Klassenmethode auch Vererbung erlaubt. Man kann sagen, das spezielle an Perl ist, dass es einfach alles nur Subroutinen sind und man sie auf verschiedene Arten aufrufen kann, aber nicht alle Aufrufmethoden immer Sinn ergeben, z.b. wäre File::Basename->dirname ein falscher Aufruf. Dann gibt es Module wie z.b. CGI.pm, die selber objektorientiert sind (bei CGI.pm ist es sogar optional): Deine Frage "Wird Vererbung häufig eingesetzt?" kann man so eigentlich nicht beantworten. Was ist häufig? Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wie frage ich & perlintro brian's Leitfaden für jedes Perl-Problem |