Thread Von CGI.pm Methods erben
(25 answers)
Opened by rosti at 2011-04-12 10:35 2011-04-12T20:46:08 rosti 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 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 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 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. |