Thread Eigenschaften von Objekten, private, nichtprivate, schreibgeschützte
(23 answers)
Opened by rosti at 2025-05-27 10:17 Quote Ja natürlich. Hunderte verschiedene HTML-Einzelseiten meines Blog werden über ein und dieselbe Subklasse als Response ausgeliefert. Lediglich die Eigenschaften wie title, body und descr sind unterschiedlich. Und per Eigenschaft interface=forum bspw. kann ich an jede dieser Seiten ein Forum unten dran hängen. Quote Ja klar. Implizit wird ja bei jedem Methodenaufruf $self->control() das Objekt übergeben. Und da in dieser Methode stets ein CGI-Objekt gebraucht wird, wird es bereits dem Konstruktor der Basisklasse übergeben: Code (perl): (dl
)
1 2 3 4 my $ro = $class->new( BIN => $routes, # alle Eigenschaften der Response-Seiten im wahlfreien Zugriff URL => $url, # der requestete URL like /index.html CGI => xCGi->new(), # Instanz meiner CGI-Klasse Wenn ich jedoch erst beim Entwurf einer Subklasse sehe, daß ich in jeder Methode dieser Subklasse eine Datenbankverbindung brauche, erstelle ich dieses DBH in der init-Methode, das ist die Methode die über das FW als Erste aufgerufen wird. Somit implementiert mein FW auch ein Interface und versucht, in jeder Subklasse die 4 Methoden init, browse, control und trailer nacheinander aufzurufen. Was das Entwickeln weiterer Subklassen extrem vereinfacht, insbesondere auch dadurch daß nicht grundsätzlich alle 4 Methoden vorhanden sein müssen. Ein weiteres Muster sollte jeder Entwickler kennen: Delegation. Damit mache ich die Methode einer fremdem Klasse zu einer Methode meiner eigenen Klasse: Code (perl): (dl
)
1 2 3 4 5 6 7 8 sub param{ my $self = shift; return $self->{CGI}->param(@_); } sub xr{ my $self = shift; return XR::xr(@_); } Lazy Delegation schließlich, lädt fremde Klassen/Instanzen über eine eigene Methode nach: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 use strict; use warnings; use TemplateSplitter; sub template{ my $self = shift; my $name = shift || 'default'; my $t = TemplateSplitter->new( $self->{BODY} ); $self->{BODY} = $t->{$name}; $self->{BODY} .= $t->{$_} for @_; } Last edited: 2025-06-05 19:54:24 +0200 (CEST) |