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

Linuxer
 2021-04-15 00:34
#193212 #193212
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Ich weiß nicht, ob ich Deinen Ansatz richtig verstehe...

Momentan würde ich an folgendes denken:

  • eine DB::Base Klasse, die die Grundfunktionen definiert (aber ohne eine new()-Methode)
  • eine DB::Service Klasse, die die Tabelle für Service definiert und eine new()-Methode, die diese Tabelle einbindet
  • eine DB::Customer Klasse, die die Tabelle für Customer definiert und eine new()-Methode, die diese Tabelle einbindet


Z.B. Beispiel:

more (12.5kb):

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#! /usr/bin/env perl
use strict;
use warnings;
use 5.020;


package DB::Base {

        sub foo {
                my $self = shift;

                printf "%s: foo\n", ref($self);
        }

        sub bar {
                my $self = shift;

                printf "%s: bar\n", ref($self);
        }

        sub show_table {
                my $self = shift;

                printf "%s: %s\n", ref($self), $self->{table};
        }
};



package DB::Service {
        use base "DB::Base";

        my $table = "service";

        # DB::Service specific constructor 
        sub new {
                my $class = shift;
                my %attr = @_;

                my $self = {
                        table => $table,
                };

                bless $self, ref($class)||$class;

                return $self;
        }
};



package DB::Customer {
        use base "DB::Base";

        my $table = "customer";

        # DB::Customer specific constructor
        sub new {
                my $class = shift;
                my %attr = @_;

                my $self = {
                        table => $table,
                };

                bless $self, ref($class)||$class;

                return $self;
        }
};


package main;

my $customer = DB::Customer->new();
$customer->show_table();

my $service = DB::Service->new();
$service->show_table();


__END__;




Alternativ könnte man auch den Konstruktor in die DB::Base Klasse verlagern und in den Klassen DB::Service und DB::Customer nur die jeweils relevanten Methoden definieren und die gewünschte Tabelle bei der Objekt-Konstruktion übergeben.

more (9.8kb):

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#! /usr/bin/env perl
use strict;
use warnings;
use 5.020;


package DB::Base {

        sub new {
                my $class = shift;

                my $self = {
                        table => shift,
                };

                bless $self, ref($class)||$class;

                return $self;
        }

        # general methods
        sub foo {
                my $self = shift;

                printf "%s: foo\n", ref($self);
        }

        sub bar {
                my $self = shift;

                printf "%s: bar\n", ref($self);
        }

        sub show_table {
                my $self = shift;

                printf "%s: %s\n", ref($self), $self->{table};
        }
};



package DB::Service {
        use base "DB::Base";

        # define methods for service actions
};



package DB::Customer {
        use base "DB::Base";

        # define methods for customer actions
};


package main;

# provide table information as argument
my $customer = DB::Customer->new('customer');
$customer->show_table();

# provide table information as argument
my $service = DB::Service->new('service');
$service->show_table();


__END__;



Details müssten noch weiter ausgearbeitet werden (z.B. "echte" Tabelle statt Skalar).
Last edited: 2021-04-15 01:53:30 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

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