1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
package DB::Service; use base DB::Base; use strict; use warnings; my %config = ( table => 'service' ); ... package DB::Base use strict; use warnings; sub load { my ($self) = @_; $self->getDataFromTable($config{table}); }
2021-04-14T21:15:55 Hagenich würde gerne in einer Kind-Klassen ein Konfiguration definieren, auf die ich auch in der Eltern-Klassen zugreifen kann. Aber irgendwie finde ich keine schicke Lösung dafür bzw. der Zugriff funktioniert nicht.
2021-04-14T21:15:55 HagenAn anderen Stellen habe ich gesehen, dass man Methoden überschreibt. D.h. in der Eltern-Klasse gibt es die Methode 'getTable', die aber leer ist; in der Kindklasse wird diese dann überschrieben, so dass sie im aktuellen Beispiel 'service' zurückgeben würde.
2021-04-15T07:49:36 hajDer Ansatz ist etwas bergauf gedacht: Eine Eltern-Klasse sollte nicht wissen müssen, ob Kind-Klassen überhaupt existieren und kann daher nicht so einfach auf Daten der Kind-Klasse zugreifen.
2021-04-15T07:49:36 hajDie Methode getTable wird in der Eltern-Klasse dann oft so implementiert, dass sie nicht leer ist, sondern lautstark stirbt, um klarzumachen, dass Kind-Klassen hier etwas zu tun gehabt hätten.
my $customer = DB::Customer->new('customer');
1 2 3 4
my $customer1 = DB::Helper->new('id customer 1', 'customer', 'euro', '...', '...', '...'); my $customer2 = DB::Helper->new('id customer 2', 'customer', 'euro', '...', '...', '...'); my $customer3 = DB::Helper->new('id customer 3', 'customer', 'euro', '...', '...', '...'); my $customer4 = DB::Helper->new('id customer 1', 'customer', 'euro', '...', '...', '...');
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#! /usr/bin/env perl use strict; use warnings; package DB::Base { sub new { my ( $class, $name, $options ) = @_; my $self = {}; bless( $self, $class ); $self->{name} = $name; $self->{options} = $options || {}; return $self; } sub option { my ( $self, $key ) = @_; die('missing key') unless ($key); die( 'missing option `' . $key . '`' ) unless ( defined $self->{options}{$key} ); return $self->{options}{$key}; } }; package DB::Customer { use base "DB::Base"; sub new { my ( $class, @args ) = @_; return $class->SUPER::new( @args, { type => 'Customer', currency => 'Euro', ... } ); } }; package main; my $customer1 = DB::Customer->new('id_customer 1'); __END__;
2021-04-16T19:14:39 Hagen... Ich hatte u.a. gehofft, dass man Attribute ähnlich wie Methoden überschreiben könnte.
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__;