Thread [Mouse] Attribute zur Laufzeit generieren und vererben
(5 answers)
Opened by GwenDragon at 2023-07-24 17:10 2023-07-25T08:48:59 GwenDragonBeinuhe! Probier's einfach mit meinem kurzen Beispiel aus, indem Du in der letzten Zeile anstelle von $c->text->Name schreibst: $c->text->{Name}. Funktioniert genauso. Ist aber unsauber und funktioniert nur, solange der Autor der Klasse bei Mouse bleibt und nicht etwa eines der nicht-Hash-Objektframeworks (deren gibt's auch etliche) verwendet. Es ist auch nicht ganz genau das gleiche. Die Methode ->Name existiert deswegen, weil ich das Attribut Name mit is => 'ro' deklariert habe. 2023-07-25T08:48:59 GwenDragonIn meinem Beispiel schon nicht mehr: Der Versuch $c->text->Name('Mehrwert') wird abgelehnt: Code: (dl
)
Cannot assign a value to a read-only accessor of Name Man sehe: Ich habe das Attribut als 'ro' (readonly) deklariert und nicht als 'rw' (read/write). Irgendwie blöd, dass $c->text->{Name} = 'Mehrwert'; trotzdem funktioniert. 2023-07-25T08:48:59 GwenDragonNicht bei den M*-Objekthelfern! Es geht bei denen überwiegend um Komfortgewinn für "anständige" Programmierer: Die Accessor-Methoden werden automatisch generiert, und beim Konstruktor wird der Typ von Parametern automagisch überprüft. OO-Features wie Vererbung, Rollen und Delegation bekommt man auch komfortabel, aber eben ... mit Kollisionsgefahr bei den Hash-Keys. Das ist ja der Grund, warum andere Objektsysteme entstanden sind: Da gibt's zum einen die ganze Latte von "Inside-Out"-Objektmodulen (von Class::Std bis Dios), bei denen die Attribute tatsächlich tricky versteckt sind. So tricky, dass der Data::Dumper, der Debugger und Serialisierer wie Storable erstmal nicht funktionieren - und deswegen haben die sich auch längst nicht so durchgesetzt wie M*. Und dann gibt's eben mit Object::Pad und ab Perl 5.38 feature 'class' die Systeme, bei denen class und method als neue Schlüsselwörter eingeführt wurden. Da sind die Attribute auch nicht mehr direkt zugänglich. 2023-07-25T08:48:59 GwenDragonDafür gibt's etliches auf CPAN, zum Beispiel Module::Loader, das in seinem "SEE ALSO"-Kapitel auch einige Alternativen nennt. |