2017-12-20 3 views
2

Ich habe versucht, eine Methode aus Selbst Methode Wörterbuch auf ein anderes Objekt Methode Wörterbuch während der Laufzeit hinzuzufügen, aber ich war nicht erfolgreich, ich bin versucht zu tun Wie kann ich Methoden von Method Dictionary zu anothor in einer richtigen Weise hinzufügen?, wie ich Methoden Methode Wörterbuch hinzufügen können

+2

"aber ich habe es nicht geschafft" .... genau was ist falsch gelaufen? Fehlermeldung? Fehlerhafte Ergebnisse? In welchem ​​Kontext nennst du das? Sind Sie in einer Instanzmethode? Klassenmethode? Sie haben auch Fehler. Es gibt keinen 'methodDic' Selektor. – lurker

+0

Ich bekomme Fehlermeldung => "Fehler: primSize: fehlgeschlagen". Ich habe versucht, eine Instanz Methode zu seiner Klasse hinzuzufügen methodDictionary – haitham

+0

In welchem ​​Kontext rufen Sie dies an? Worauf bezieht sich "Selbst"? – lurker

Antwort

0

Dies ist eigentlich eine großartige Übung für das Lernen, dass alles ein Objekt in Smalltalk ist :) Die Methoden im MethodDictionary sind einfach Instanzen von CompiledMethods, die auf viele Arten verwendet werden können. Dh Klassen zur Laufzeit zu manipulieren, eine Art zu reflektieren Programmierung.

Wie für Ihre Frage gibt es nur einen kleinen Fehler in Ihrem Code. Anstatt methodDict mit dem methodDictionary-Accessor zu verwenden, sollte es gut funktionieren. Auf methodDict sollte nicht direkt zugegriffen werden.

Hier ist ein kleiner Spielplatz, den Sie in Ihrem Pharo-Bild ausführen können. Ersetzen Sie einfach ClassA und B durch Ihren jeweiligen. Danach werden Sie sehen, dass die kopierten Methoden erhalten bleiben und beim Durchsuchen von ClassB sichtbar bleiben.

"list methods of ClassA and ClassB" 
Transcript open; clear. 
Transcript show: '**ClassA methodDictionary:', String crlf. 
ClassA methodDictionary associationsDo: 
    [:assoc | Transcript show: assoc value asString, String crlf]. 
Transcript show: '**ClassB methodDictionary (Before):', String crlf. 
ClassB methodDictionary associationsDo: 
    [:assoc | Transcript show: assoc value asString, String crlf]. 

"Transfer all methods of ClassA to ClassB" 
ClassA methodDictionary associationsDo: 
    [:assoc | ClassB methodDictionary at: assoc key put: assoc value]. 

"again .. list methods of ClassB" 
Transcript show: '**ClassB methodDictionary (After):', String crlf. 
ClassB methodDictionary associationsDo: 
    [:assoc | Transcript show: assoc value asString, String crlf]. 
Verwandte Themen