Objective-C: Zugriff auf Klassenelemente - Accessor-Methoden
-
2 Zugriff auf Klassenelemente
Vorwort
C++ ist nicht der einzige Ansatz gewesen, um der Sprache C die Möglichkeiten objektorientierter Programmierung einzuhauchen. Es gab die Entwicklung von Objective-C, die ebenfalls diese Möglichkeiten ergänzte, und gleichzeitig eine Kompatibilität zu C erhielt. Die Sprache war in der Breite wenig bekannt, da sie vor allem auf den Mac-Systemen zur Applikationsentwicklung benutzt wurde und wird. Durch den Boom von Mac, iPhone und wohl bald auch iPad wird die Sprache allerdings zusehends wichtiger werden, daher gibt es im Magazin nun eine einführende Artikelserie zu Objective-C (kurz: ObjC).
Dieser Artikel ist von http://www.cocoa-coding.de übernommen und behandelt wie Klassen und Objekte in Objective-C aufgebaut sind.
2.1 Accessor-Methoden
Im Kapitel Klassen, Teil 1 wurden schon die so genannten Accessor-Methoden angesprochen, eben jene Methoden, mit denen man auf die Instanzvariablen und deren Inhalte zugreifen kann.
Accessor-Methoden sind für eine Klasse notwendig, denn die Instanzvariablen selbst sind "privat", das bedeutet, von ausserhalb der Klassen kann nicht darauf zugegriffen werden.Man unterscheide dabei zwei verschiedene Methoden, den setter, der benutzt wird um Werte in eine Variable zu schreiben, und den getter, der zum Einsatz kommt, um den Variableninhalt wieder auszulesen.
Für die Variable
int age;
sehen die passenden Accessor-Methoden dann so aus:-(void) setAge:(int)x { age = x; } -(int) age { return age; }
Recht viel Schreibarbeit könnte man meinen, und das ist es zweifellos auch. Accessor-Methoden haben aber durchaus Sinn, denn Sie ermöglichen zum Beispiel den zu setzenden Wert zu kontrollieren. So können Sie beispielsweise sicherstellen, dass einer Person kein negatives Alter zugewiesen wird.
Weil das Erstellen von Accessor-Methode ein langweiliger und immer wiederkehrender Prozess ist, können Sie sich von Xcode den Großteil der Arbeit abnehmen lassen. Einzig die Variablendeklaration müssen sie noch selbst schreiben.
#import <Cocoa/Cocoa.h> @interface Person : NSObject { int age; } @end
Markieren Sie nun die Zeile
int age;
und wählen Sie aus dem Script Menü Code->Place Accessor Decls on Clipboard.Xcode erzeugt nun im Hintergrund Deklarationen für Accessor-Methoden. Diese können Sie nun ohne Schwierigkeiten durch den Befehl Edit->Paste oder durch die Tastenkombination cmd+v in die Headerdatei einfügen.
- (int)age; - (void)setAge:(int )value;
Genau so funktioniert es auch mit der Definition der Methoden, nur das Sie jetzt Place Accessor Defs on Clipboard wählen müssen. Diese Codeschnipsel gehören dann natürlich in die Code Datei.
- (int)age { return age; } - (void)setAge:(int )value { if(age != value) { age = value; } }
Wie Sie sehen wird hier sogar richtig intelligenter Code erzeugt, denn
age
wird nur überschreiben, wenn der Wert unterschiedlich ist. Noch interessanter wird es, wenn sie einen auf Zeiger basierten Datentype nutzen. Sollte dies Ihrer Neugierde geweckt haben ersetzen sie doch mal(int)age
durch
NSNumber *age;
und wiederholen den ganzen Vorgang.
Es ist nicht zwingend getter und setter Methoden zu implementieren. Wollen Sie eine Variable, die nur setzbar ist, können sie auf den getter verzichten. Haben sie hingegen eine Variable, die nur lesbar sein soll, wie zum Beispiel ein Rechenergebnis, brauchen sie natürlich keinen setter.