| 

.NET C# Java Javascript Exception

3
Wie definiere ich in Objective C ob eine Methode public, protected oder private sein soll? So wie ich es aus Java kenne? Geht das überhaupt?
23.08.2011
ph89 31 1 2
1 Antwort
3
Hallo,

innerhalb OBJ-Methoden gibt es keine Zugriffsrechte wie in Java, für Klassenvariablen dagegen wohl.

Als "Entschärfung" des Problems und somit als Ersatz für private kann man eine Klasse im Definitionsteil (im .m, resp. .mm - File) als sog. Category Definieren.

Also die Obj-C Categories dafür gebrauchen (missbrauchen? ;) ). Ich mache das zumindest so. ;-)


Also MyClass.h:

#include <Cocoa/Cocoa.h>

@interface MyClass : NSObject
{
@private
int privateScopedVar;
@protected
int protectedScopedVar;
@public
int publicScopedVar;
@package
int packageScopedVar;
}
/* @private, @protected, @public and @package are not available in Obj-C functions!
* Every call is implicit "public"! */
-(void)publicCall;
@end // interface


...und in MyClass.m:
#include "MyClass.h"

/* Private methods of MyClass implemented within a category MyPrivateMethods */
@interface MyClass (MyPrivateMethods)
-(void)myPrivateMethod;
@end /* interface MyClass (MyPrivateMethods) */

@implementation MyClass (MyPrivateMethods)
-(void)myPrivateMethod
{}
@end /* implementation MyClass (MyPrivateMethods) */

// Public methods
@implementation MyClass
-(void)publicCall
{
/* do something
* e.g call "private" Method ... */
[self myPrivateMethod];
}
@end /* implementation MyClass */


Dadurch, dass man die privaten Methoden nur innerhalb des Definitionsteil erwähnt, sind sie auch nur dort "sichtbar". Aber Achtung: Die Calls werden aber dennoch exportiert! Ein externes Modul kann sie durchaus aufrufen, wenn es weiss, dass es diese Klassenfunktion gibt! Daher ist der o.g. Zugriffsschutz nicht so strikt wie bei Java, C++, oder C#.

Übrigens: Man kann auch auf die o.g Category verzichten, wenn man alle "privaten" Methoden vor dem tatsächlichen Aufruf einfach definiert - also innerhalb des @implementation Teils erwähnt! Man braucht dann nicht einmal eine Deklaration!

Als Beispiel hier für diesen Fall das vereinfachte MyClass.m :

#include "MyClass.h"
...
// Public methods
@implementation MyClass
/* Define this before the actual usage! */
-(void)myPrivateMethod
{
/* do something "private" */
}

-(void)publicCall
{
/* do something
* e.g call "private" Method ... */
[self myPrivateMethod];
}
@end /* @implementation MyClass */
23.08.2011
hdusel 195 4

Stelle deine Mobile-Frage jetzt!