2011-10-07 11 views
29

chciałbym wzorzec dla zagnieżdżonych klasy prywatnej w Objective Clekcje prywatne w Objective C

Wymagania są następujące:

  • klasy nie będą widoczne/dostępne dla innych klas.
  • klasa może wykonać metod (tj, nie C struct)
  • zawierające członków klasy są widoczne/dostępne dla zagnieżdżonych klasy

rozpatrzeniu uwag, jestem uproszczenie wymogów:

  • Klasa wewnętrzna może być dostępna dla innych klas, ale niewidoczna (podobnie jak w przypadku kategorii do ukrycia prywatnych metod).
  • wewnętrzna klasa nie musi być zagnieżdżone

Czy to jeszcze możliwe?

+0

Co z "klasą"? – Dani

+1

Niestety, to, o co prosisz, nie istnieje w Obj-C. –

+0

@Kevin Ballard: istnieje w Obj-C++ – Dani

Odpowiedz

84

Objective-C nie ma pojęcia klas prywatnych ani prywatnych instancji zmiennych w formalny sposób deklaratywny.

Zamiast tego, widoczność w Objective-C jest w całości kontrolowana przez miejsce, w którym deklarujesz coś. Jeśli znajduje się w pliku nagłówkowym, może zostać zaimportowany przez coś innego. Jeśli zostanie zadeklarowany w pliku implementacji, nie można go (w rozsądnym zakresie) zaimportować, a zatem jest on faktycznie prywatny dla tej jednostki kompilacji.

I przez "to" mam na myśli prawie wszystko, co można zadeklarować; klasa, globalna, itp. ...

tj. jeśli wpiszesz parę @interface/@implementation dla klasy w pliku .m, ta klasa będzie faktycznie prywatna dla tej jednostki kompilacji. Oczywiście, bez przestrzeni nazw, upewnij się, że klasa jest jednoznacznie nazwana.


Rozważ to:

Foo.h:

@interface Foo: NSObject 
... public interface 
@end 

Foo.m:

@interface __FooSupportClass: NSObject 
... interface here ... 
@end 

@implementation __FooSupportClass 
@end 

@interface Foo() 
@property(retain) __FooSupportClass *__fooSupport; 
@end 

@implementation Foo 
@synthesize __fooSupport = fooSupport__; 
... etc ... 
@end 

To daje prywatny po widoczności klasy support dostępne tylko w twoja implementacja ze zmiennymi instancji i metodami setter/getter na twojej klasie, które nie są widoczne poza kompilacją jednostka albo.

(Zauważ, że Objective-C ma „zmienne instancji”, a nie „zmienne”. Są one podobne, ale będziesz lepiej wyłączyć za pomocą słownictwa języka.)

+0

To było moje oryginalne podejście. Potrzebuję jednak instancji tej wewnętrznej klasy, aby być członkiem. Jak mogę to zrobić? Czy wysłanie deklaracji @class podniosłoby sprawę? – Ovesh

+0

OK, właśnie to sprawdziłem. OK, to jest podejście, z którym będę współpracować. Oczywiście, pozostaje problem członków klas zawierających klasy, które nie są dostępne dla klasy wewnętrznej. – Ovesh

+0

Jak uzyskać dostęp do zmiennej foo z fooSupport? Czy to możliwe? – Sakthimuthiah

1

Cóż można mieć " pół-ukryte "prywatne metody. Możesz dołączyć plik interfejsu, który udostępnia metody rozszerzeń znajdujące się w pliku implementacji, a następnie po prostu implementuj deklarowane tam metody. Ciekawi mnie to wcześniej i zadałem podobne pytanie.

Proper Objective-C Helper "Wannabe" Private methods?