как добавить переменную-член и методы во встроенный класс без его наследования - PullRequest
5 голосов
/ 04 марта 2010

Как я могу добавить переменные-члены и методы во встроенный класс (скажем, NSString) без его подкласса.

Ответы [ 4 ]

6 голосов
/ 04 марта 2010

Для методов: вы можете использовать категории для добавления методов-членов без создания подклассов. Это довольно распространенная практика в Какао - добавлять методы расширения для каждой платформы.

Для переменных экземпляра: начиная со Snow Leopard (Mac OS X 10.6), вы можете использовать ассоциативные ссылки . Вы используете их для имитации добавления переменных экземпляра объекта в существующий класс.

Язык программирования Objective-C довольно прост в том, что вы можете делать как с ассоциативными ссылками, так и с категориями.

3 голосов
/ 04 марта 2010

«Категории» позволяют добавлять методы, но не переменные-члены, к существующим классам.

См. Раздел этого урока по ним (поиск на странице): http://cocoadevcentral.com/d/learn_objectivec/ Или посмотрите «Категории» в документах Objective-C где-нибудь еще.

Вы не можете добавлять экземпляры без подклассов.

1 голос
/ 04 марта 2010

Вы не можете. Иногда это плохая идея для создания подкласса (например, вы работаете с кластером классов), поэтому люди часто работают над этим, создавая совершенно новый класс (подкласс NSObject, а не рассматриваемого класса), который содержит переменная экземпляра, типом которой является рассматриваемый класс, а также требуемые добавленные переменные.

Например, если вы хотите создать подкласс NSString с дополнительной BOOL под названием "foo" ...

@interface StringWithFoo : NSObject
{
    NSString* string;
    BOOL foo;
}

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

Это пример шаблона декоратора .

0 голосов
/ 04 марта 2010

Вы можете добавить методы-члены в класс без создания подкласса, создав категорию, но это не позволит вам добавлять переменные-члены.

Хотя во время выполнения в target-c можно сделать много вещей, которые нельзя сделать на других языках (см. справочник по времени выполнения ), я бы не советовал так много хакеров добавлять экземпляр переменная для существующего класса.

Не могли бы вы объяснить причину, по которой вы не хотите создавать подкласс? Подкласс или категория действительно кажутся лучшим выбором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...