Подтвердить что ты не робот

Частные методы с использованием категорий в Objective-C: вызов супер из подкласса

Я читал, как реализовать частные методы в 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

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

Ура!

4b9b3361

Ответ 1

Эта страница GNUStep описывает один подход. Раздел 4.5:

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

Ответ 2

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