Есть ли хороший / лучший способ расширить вложенный класс в Objective-C? - PullRequest
0 голосов
/ 13 июня 2011

Иногда объекты инфраструктуры помещают интерфейсы вспомогательных классов в файлы * .m, например:

Foo.m:

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

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

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

Ответы [ 3 ]

1 голос
/ 13 июня 2011

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

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

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

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

0 голосов
/ 13 июня 2011

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

0 голосов
/ 13 июня 2011

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

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

...