2009-10-17 11 views
12

czytałem jak zaimplementować metody prywatne w Objective-C (Best way to define private methods for a class in Objective-C) i pytanie pojawiło się w mojej głowie:metody prywatne korzystające kategorie w Objective-C: wzywającą Super z podklasy

Jak zarządzać implementować metody chronione, czyli prywatne metody, które są widoczne dla podklas?

Załóżmy, że mam MySuperClass z kategorią zawierającą wszystkie jej prywatne metody i chcę zaimplementować MySubclass nadpisując lub wywołując super do jednej z prywatnych metod MySuperClass. Czy to możliwe (stosując podejście Kategorie do wdrażania metod prywatnych)?

Spójrz na niektóre z tego kodu, na dole znajduje się metoda overriden.

// =========================== 
// = File: MySuperClass.h 
// = Interface for MySuperClass 
// =========================== 

@interface MySuperClass : Object 
... 
@end 

// =========================== 
// = File: MySuperClass.m 
// =========================== 
#import "MySuperClass.h" 

// ================================= 
// = Interface for Private methods 
// ================================= 
@interface MySuperClass (Private) 

-(void) privateInstanceMethod; 

@end 

// ===================================== 
// = Implementation of Private methods 
// ===================================== 
@implementation MySuperClass (Private) 

-(void) privateInstanceMethod 
{ 
    //Do something 
} 

@end 

// ================================ 
// = Implementation for MySuperClass 
// ================================ 
@implementation MySuperClass 
... 
@end 




// =========================== 
// = File: MySubClass.h 
// = Interface for MySubClass 
// =========================== 

@interface MySubClass : MySuperClass 
... 
@end 


// ================================ 
// = Implementation for MySubClass 
// ================================ 

#import MySubClass.h 

@implementation MySubClass 
//OVERRIDING a Super Private method. 
-(void) privateInstanceMethod 
{ 
    [super privateInstanceMethod]; //Compiler error, privateInstanceMethod not visible! 
    //Do something else 
} 
@end 

Mam nadzieję, że ktoś już to rozgryzł.

Pozdrawiam!

+0

"Na szczęście ktoś już to rozgryzł." ... Więc o co pytasz? –

+0

Zamieszanie języka, myślę. Naprawiony. – nall

+1

Dziękuję ci, że moje pytanie było łatwiejsze do zrozumienia dla wszystkich. Popełniłem błąd używając słowa "na szczęście", kiedy faktycznie miałem na myśli "z nadzieją". Przepraszam i dziękuję bardzo! – Lio

Odpowiedz

13

This GNUStep page opisuje jedno podejście rozdział 4.5:

... Jasna strona to jest to pozwala symulować chroniony metod, jak również. W tym celu autor podklasy musi być poinformowany o niektórych metodach chronionych, i będą musieli znosić ostrzeżenia kompilatora . Alternatywnie, można zadeklarować Protected kategorię w pliku oddzielny interfejs (np „PointProtected.h”), oraz zapewnienie tego pliku interfejsu ze zrozumieniem , że powinien on być importowany tylko i używany przez pliku interfejsu podklas .

+0

Tak to robię. Wystarczy umieścić deklaracje metody w nagłówku kategorii, ale implementuj je w głównym bloku implementacji. Następnie pliki, które muszą wiedzieć o tej metodzie, muszą "# importować" nagłówek. –

+0

Dziękuję wam, Dave i nieważne. Twoje zdrowie – Lio

13

Na Apple, kiedy budować ram typowy wzór ma mieć nagłówek publicznego (MyClass.h) i prywatny nagłówek (MyClass_private.h), a tylko skopiować nagłówki publicznych do produktu kompilacji. Plik .m będzie oczywiście # na obu.

Powiązane problemy