Thread Von CGI.pm Methods erben (25 answers)
Opened by rosti at 2011-04-12 10:35

clms
 2011-04-12 23:54
#147665 #147665
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
2011-04-12T20:46:08 rosti
Die Methoden werden in dem Moment geerbt, wenn mit use base 'CGI' die Superklasse eingebunden wird. Dann ist für param und header der eigene Code:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub header{
        my $self = shift;
        return $self->{CGI}->header(@_);
}

sub param{
        my $self = shift;
        return $self->{CGI}->param(@_);
}


ein Overload. Derselbe Code ist eine Delegation, wenn kein use base 'CGI'; oder our @ISA = qw(CGI); erfolgte.

Es funktioniert sowohl der Overload als auch die Delegation mit obenstehenden Code.

Der Overload funktioniert hier nur als Delegation und nur bei den Methoden, die Du explizit delegierst.
Obwohl Dein neues Objekt nach außen hin behauptet ein (Subtyp von) CGI zu sein - und isa() und can() entsprechende Werte zurückliefern - funktionieren andere CGI-Methoden mit Deinem Objekt nicht mehr, weil Deinem Objekt $self die internen Daten/Attribute von CGI fehlen. Die sind ja nach $self->{CGI} ausgelagert. Somit bricht es mit fast allen Regeln der Objektorientierung.

2011-04-12T20:46:08 rosti
Edit: Die Delegation ist handhabungssicherer,

Als Dein Mischmasch auf jeden Fall.
Saubere Vererbung, bei der Deine Klasse nicht nur vorgaukelt von CGI zu erben, sondern tatsächlich von CGI erbt (inkl. aller internen Werte), ist aber mindestens ebenso "handhabungssicherer".

2011-04-12T20:46:08 rosti
der Programmierer ist gezwungen, die Methode zu definieren, sonst ist sie nicht vorhanden.

Nicht unbedingt.

Wie ich in meinem anderen Beitrag schon geschrieben habe, kannst du die Delegation mit AUTOLOAD() vervollständigen. Dann brauchst Du nicht
alle CGI-Methoden explizit zu überschreiben und delegieren.

Wenn bei der Klasse, die mit reiner Delegation arbeitet, eine Methode aufgerufen wird, die Du nicht implementiert hast, wird stattdessen $self->AUTOLOAD aufgerufen.
Dort kannst Du mit $self->{CGI}->can() überprüfen, ob dies eine CGI-Methode ist. Wenn ja, kann AUTOLOAD die Methode an das eingebettete CGI-Objekt delegieren. Dann brauchst Du nur noch die Methoden selbst schreiben, für die Du explizit ein von CGI abweichendes Verhalten willst.
Das dürfte Dir eine Menge Schreibarbeit sparen.

2011-04-12T20:46:08 rosti
Werden Methoden geerbt, sind sie vorhanden aber funktionieren nicht erwartungsgemäß wenn sie nicht überschrieben wurden.

Das gilt nur bei Deinem Mischmasch. Eine Delegation per AUTOLOAD() ist dort nicht mehr möglich, da Deine Klasse über ihre Base-Class vorgibt alle CGI-Methoden selbst zu können. AUTOLOAD würde also für CGI-Methoden nie aufgerufen.

View full thread Von CGI.pm Methods erben