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

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

5
задан Lenin Raj Rajasekaran 20 January 2014 в 17:13
поделиться

4 ответа

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

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

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

6
ответ дан 13 December 2019 в 22:06
поделиться

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

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

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

3
ответ дан 13 December 2019 в 22:06
поделиться

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

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

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

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

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

1
ответ дан 13 December 2019 в 22:06
поделиться

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

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

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

0
ответ дан 13 December 2019 в 22:06
поделиться