Ja, ein Beispiel mache ich gern:
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
83
84
85
86
87
88
89
90
91
92
93
94
package Datum;
use base qw( Exporter );
our EXPORT = qw ();
sub new {
# neue Instanz erzeugen
my $class = shift;
$class = ref($class) if ref($class);
# Datumswerte werden einzeln gespeichert
my $self = {
year => 0,
month => 0,
day => 0,
};
bless $self, $class;
return $self;
}
sub set {
# Datumswerte setzen
# Parameter-Reihenfolge nach ISO
my $self = shift;
my ($y, $m, $d) = @_;
$self->{year} = $y;
$self->{month} = $m;
$self->{day} = $d;
}
sub dateformat {
# Datumsformat der Klasse liefern
return "%y-%m-%d";
}
sub get {
# Datum abfragen
# ISO-Format
my $self = shift;
my $date = $self->dateformat();
$date =~ s/%y/$self->{year}/g;
$date =~ s/%m/$self->{month}/g;
$date =~ s/%d/$self->{day}/g;
return $date;
}
sub tounixtime {
my $self = shift;
my $unixtime = ...
return $unixtime;
}
sub print {
my $self = shift;
print $self->get();
}
1;
package Datum::DE;
use base qw( Datum );
sub dateformat {
return "%m/%d/%y";
}
1;
package Datum::US;
use base qw( Datum );
sub dateformat {
return "%d.%m.%y";
}
1;
package main;
my $gerdate = new Datum::DE(2003, 10, 2);
$gerdate->print();
my $usdate = new Datum::US(2003, 10, 2);
$usdate->print();
Ich möchte vor allem darauf hinweisen, dass ich mir in den Subklassen nicht nur die Neuprogrammierung von new(), set(), get(), tounixtime() und print() sparen konnte.
Da ist noch ein verstecktes Bonbon: get() verwendet ja dateformat(), und das ist in jeder Klasse eine andere Funktion. Dennoch muss ich wegen dieser Mehrdeutigkeit get() nicht in jeder Subklasse neu schreiben. Perl kümmert sich darum, dass die dateformat() Methode der jeweils eigenen Klasse benutzt wird. Das nennt sich "Polymorphismus".
HTH!