Schrift
[thread]7659[/thread]

OOP - eigenschaften vererben

Leser: 11


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
norman
 2006-01-28 15:08
#62381 #62381
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
hallo,

habt ihr ne idee wie man vererbung von objekteigenschaften in perl abbildet?

folgendes beispiel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# basisobjekt
my $mitarb1 = mitarbreiter->new(
'name','hans',
'birth','20.11.1969'
);

# folgendes objekt soll die eigenschaften von $mitarb1 erben
# d.h. auch im objekt $mitarb1_erw1 sollen die eigenschaften
# 'name' und 'birth' zur verfügung stehen
my $mitarb1_erw1 = mitarbreiter_abt_verwaltung->new(
'position','sachbearbeiter'
);

# gewueschtes resultat
print $mitarb1_erw1->get('name');
# -> hans


viele grüße,
norman
lichtkind
 2006-01-28 21:00
#62382 #62382
User since
2004-03-22
5679 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
normale vererbung halt

@ISA = 'Mutterklasse';

oder per use base. schau mal in unsre wiki da ist sicher tutorial wenn nicht in die links da sind mehrere.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Ronnie
 2006-01-28 21:03
#62383 #62383
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Normalerweise vererben Instanzen keine Attribute. Gib es doch als Argument an den Konstruktor der anderen Klasse.
renee
 2006-01-29 02:22
#62384 #62384
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Normalerweise werden auch nicht fuer eine Person zwei Objekte erzeugt, sondern nur eins! Und zwar von der abgeleiteten Klasse. Das ist nicht nur in Perl so, sondern ueberall...

BasisKlasse.pm
Code: (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
package BasisKlasse;

use strict;
use warnings;

sub new{
my ($class,%args) = @_;
my $self = {};
bless $self,$class;

$self->{Name} = $args{name} || "testname";
$self->{Birthday} = $args{birth} || "00.00.0000";

return $self;
}

sub name{
my ($self,$name) = @_;
$self->{Name} = $name if(defined $name);
return $self->{Name};
}

sub birth{
my ($self,$birth) = @_;
$self->{Birthday} = $birth if(defined $birth);
return $self->{Birthday};
}

1;


AbgeleiteteKlasse.pm
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package AbgeleiteteKlasse;

use strict;
use warnings;
use base qw(BasisKlasse);

sub new{
my ($class,%args) = @_;
my $self = $class->SUPER::new(%args);
$self->{Position} = $args{position} || "Angestellter";
return $self;
}

sub position{
#... mach was
}

1;


skript.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;
use lib qw(.);
use AbgeleiteteKlasse;

my $mitarbeiter = AbgeleiteteKlasse->new(name => 'Rainer', birth => '12.12.1947',position => 'Sachbearbeiter');

print "Name: ",$mitarbeiter->name(),"\n",
"Geburtsdatum: ",$mitarbeiter->birth(),"\n";
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
norman
 2006-01-29 11:37
#62385 #62385
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
ja, das personenbeispiel hinkt ein wenig...

konkret habe ich ein basisobjekt, das aufwendig konfiguriert wird. es enthält die konfiguration für weitere objekte.

von diesem konfigurationsobjekt werden zur zeit verschiedene klassen abgeleitet.

mein ansatz war, dieses konfigurationsobjekt vererbt alle seine eigenschaften auf später abgeleite klassen.

wahrscheinlich macht das keinen sinn. ich werde einfach dieses konfigurationsobjekt als argument an die entsprechenden objekte übergeben. oder eine eigenschaften-clone-methode nutzen.
renee
 2006-01-29 11:50
#62386 #62386
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Koenntest Du da vielleicht etwas genauer werden?? Vielleicht faellt uns ja was dazu ein, wie man es loesen koennte...

Was Du im Prinzip machen koenntest:
Du koenntest das Objekt der Basisklasse als Argument des Konstruktors der abgeleiteten Klasse benutzen.

Du koenntest der Basisklasse eine get_attributes()-Methode verpassen und das Ergebnis dieser Methode als Parameter benutzen...

Wenn die Basisklasse als Singleton (Design Pattern siehe perldesign*****. com/) implementieren kannst, dann waere das auch noch eine Moeglichkeit...
Last edited: 2020-01-28 18:27:54 +0100 (CET)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
norman
 2006-01-29 12:24
#62387 #62387
User since
2004-03-11
46 Artikel
BenutzerIn
[default_avatar]
sehr interessant ressource das perldesign*** .com

kurzfristig werde ich das problem aber erstmal so lösen:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# konfigurationsobjekt
my $mitarb1 = mitarbreiter->new(
'name','hans',
'birth','20.11.1969'
);

my @attr = $mitarb1->get_attributes();

# objekt mit einigen eigenschaften vom konfigurationsobjekt
my $mitarb1_erw1 = mitarbreiter_abt_verwaltung->new(
@attr,
'position','sachbearbeiter'
);

# gewueschtes resultat
print $mitarb1_erw1->get('name');
# -> hans

Last edited: 2020-01-28 18:27:35 +0100 (CET)
Strat
 2006-01-29 20:05
#62388 #62388
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn ein objekt alle automatischen eigenschaften der uebergeordneten objekte haben soll, dann jage ich einfach im konstruktor die ganze hierarchie durch, sodass jeder ausgefuehrt wird und fuer jeden die _initialize-Methode aufgerufen wird. So als Idee (das alleine funktioniert noch nicht):
Code: (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
package Irgendwas::Level::20;
use warnings;
use strict;
use Carp;

use base qw(Irgendwas::Level);

sub new {
my ($class, @properties) = @_;

unless (0 == scalar(@properties) % 2) { # oder so aehnlich
croak "Usage: Class->new(key1 => value1, key2 => value2)\n"
} # unless

my $self = {};
bless ($self, $class);

if ($self->SUPER::can('new')) {
$self->SUPER::new(@properties);
} # if

$self->_initialize(@properties);

return $self;
} # new
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
renee
 2006-01-29 23:56
#62389 #62389
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Strat: Da musst Du trotzem die properties angeben. Genau das macht ja das mit get_attributes und diese dem Konstruktor mitgeben...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2006-01-30 01:57
#62390 #62390
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
my %a = (haarschnitt => 'kurz',
auto => 'mercedes',
);
my %b = (auto => 'trabant',
augen => 'treu'
);
my %c = (%a, %b);
use Data::Dumper;
print Dumper \%c;

Die Ausgabe ist:
Code: (dl )
1
2
3
4
5
$VAR1 = {
'haarschnitt' => 'kurz',
'auto' => 'trabant',
'augen' => 'treu'
};
So ähnlich könntest Du das machen. Du musst nur noch einen Konstruktor drum herumbasteln.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-01-28 15:08.