Thread Klassen-Attribut auch in der Base-Klassen nutzen (5 answers)
Opened by Hagen at 2021-04-14 23:15

haj
 2021-04-17 19:14
#193218 #193218
User since
2015-01-07
558 Artikel
BenutzerIn

user image
2021-04-16T19:14:39 Hagen
... Ich hatte u.a. gehofft, dass man Attribute ähnlich wie Methoden überschreiben könnte.

Na jaaa, es ist Perl, und da kann die Grenze zwischen Methoden und Attributen einigermaßen fließend sein.

Wenn Dich unnötig erzeugter Code stört: Du brauchst die "leere" Methode in der Eltern-Klasse nicht zu definieren. Das würde dann ein statischer Code-Checker anmeckern... aber die gibt's eh nicht für Perl.

Für solche Klassen, wie Du sie hier beschreibst, bringen die Objekt-Frameworks wie CPAN:Moo übrigens einiges an Ersparnis bei der Schreibarbeit. Das sähe dann so aus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#! /usr/bin/env perl
use 5.020;
use strict;
use warnings;

package DB::Base {
  use Moo;

  has name => (is => 'ro');

  sub option {
    my ( $self, $key ) = @_;
    die('missing key') unless ($key);
    die( 'missing option `' . $key . '`' )
      unless $self->can($key);
    return $self->$key;
  }
}


package DB::Customer {
  use Moo;
  extends 'DB::Base';

  has type     => (is => 'ro', default => 'customer');
  has currency => (is => 'ro', default => 'Euro');
  ...;
}

package main;

my $customer1 = DB::Customer->new(name => 'id_customer 1');

__END__;


Eine offensichtliche Änderung gegenüber Deiner Implementierung ist, dass der Name nicht als Positionsparameter, sondern als Key/Value-Paar an new übergeben wird. Auch das kann man noch angleichen mit BUILDARGS, das mache ich aber nur, wenn ich den Caller-Code wirklich nicht anfassen will (oder kann).

View full thread Klassen-Attribut auch in der Base-Klassen nutzen