2009-10-17 8 views
12

я читал, как реализовать частные методы в Objective-C (Best way to define private methods for a class in Objective-C) и вопрос выскочил в моей голове:Частные методы, использующие категории в Objective-C: вызов супер из подкласса

Как управлять для реализации защищенных методов, т.е. частных методов, которые видны для подклассов?

Предположим, у меня есть MySuperClass с категорией, содержащей все свои частные методы, и я хочу реализовать переопределение MySubclass или вызов super одному из личных методов MySuperClass. Возможно ли (используя подход «Категории» к реализации частных методов)?

Посмотрите на некоторые из этого кода, в нижней части находится метод 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 

Надеюсь, кто-то уже понял это.

Cheers!

+0

«К счастью, кто-то уже понял это». Итак, что вы спрашиваете? –

+0

Язык путаница, я думаю. Исправлена. – nall

+1

Благодарим вас за то, что вы поняли мой вопрос. Я допустил ошибку, используя слово «к счастью», когда я на самом деле имел в виду «надеюсь». Извините и благодарю вас! – Lio

ответ

13

This GNUStep page описывает один подход Раздел 4.5:

... Светлая сторона этого она позволяет имитировать защищенные методы. Для этого писатель подкласса должен быть проинформирован в некотором образом об защищенных методах, и им нужно будет скомпоновать предупреждения . Кроме того, вы могут объявить незащищенную категорию в отдельном файл интерфейс (например, «PointProtected.h»), и предоставить этот файл интерфейса с пониманием , что он должен быть импортирован только и используется файл интерфейс подкласса ,

+0

Вот как я это делаю. Просто поместите объявления метода в заголовок категории, но реализуйте их в основном блоке реализации. Тогда файлы, которые должны знать о методе, просто должны «# импортировать» заголовок. –

+0

Благодарю вас, Дэйв и Налл. ура – Lio

13

В Apple, когда они строят рамки типичный образец должен иметь публичный заголовок (MyClass.h) и частный заголовок (MyClass_private.h), и копировать только публичные заголовки в сборки продукта. Файл .m будет, конечно, #import обоими из них.