0

Иногда рамочная объекты положить интерфейсы вспомогательный класс внутри из * .m файлов, таких как:Есть ли хороший/лучший способ расширения вложенного класса в Objective-C?

Foo.m:

@interface HelperObject : NSObject 
/*...*/ 
@end 
@implementation HelperObject 
/*...*/ 
@end 

@implementation Foo 
/*...*/ 
@end 

Если я хочу продлить Foo, например, используя категорию, есть способ расширения HelperObject? В более общем плане, это является нарушением инкапсуляции? Должен ли я попытаться расширить функциональность класса без расширения HelperObject?

ответ

0

Вызывающие из Foo не знаю ничего о HelperObject --frequently, они даже не знают о ее существовании. Так что нет, это небезопасно или допустимо, чтобы подклассифицировать его в другом файле.

0

Объектив C не допускает вложенные классы (в отличие от Java или C++, например). Вы можете использовать агрегацию для расширения функциональности классов. Если вы хотите скрыть что-то, вы можете использовать идиом Pimpl, однако в ObjC нет необходимости, потому что вы можете легко заменить это на категорию.

Редактировать: если вы хотите расширить объект HelperObject с помощью категории, вы должны объявить его в том же файле, где вы хотите использовать эти функции (чтобы они были видны).

+0

Он спрашивает о pimpl. Перечитайте вопрос. :) –

1

Вы можете распространять либо Helper, либо Foo с помощью категорий, но вы не можете расширять их как с одной категорией. Учитывая взаимосвязь между Helper и Foo (где Helper фактически является невидимым вспомогательным классом), я не вижу большой ценности, позволяя это.

В целом, Objective-C не поддерживает множественное наследование классов или категорий.

Он, однако, поддерживает множественное наследование интерфейсов через протоколы.

То есть, вы можете объявить протокол в своем файле .m, который реализует как Helper, так и Foo.