Эмуляция публичных / защищенных статических переменных в Objective-C - PullRequest
1 голос
/ 07 сентября 2011

Ответ с наибольшим количеством голосов на этот вопрос SA ( Objective C Статические переменные уровня класса ) достаточно хорошо описывает мой вопрос, но к нему я хотел бы добавить еще один критерий:

Описание проблемы

  1. Вы хотите, чтобы у вашего ClassA была переменная класса ClassB.
  2. Вы используете Objective-C в качестве языка программирования.
  3. Objective-C не поддерживает переменные класса, как в C ++.

  4. Я хочу получить доступ к переменной класса ClassA из подкласса ClassASub

или даже лучше

4a. Я хочу, чтобы метод ClassA обращался к переменной класса, как она есть, переопределена в ClassASub

Есть идеи? Или это просто изгиб Objective-C на один шаг слишком далеко?

1 Ответ

1 голос
/ 07 сентября 2011

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

static SomeClass *gClassVar;

@implementation ClassA

+ (SomeClass *)classVar {
    if (!gClassVar)
        gClassVar = ...;
    return gClassVar;
}

+ (...)someMethod {
    [[self classVar] doSomething];
}

@end

Тогда

static SomeClass *gClassVar;

@implementation ClassASubclass

+ (SomeClass *)classVar {
    if (!gClassVar)
        gClassVar = ...;
    return gClassVar;
}

@end

Итак, когда вы вызываете [ClassA someMethod], он будет работать на ClassA экземпляре classVar. Когда вы вызываете [ClassASubclass someMethod], он будет работать на экземпляре ClassASubclass.

Идея иметь переменные любого вида, прикрепленные к объекту (классу или экземпляру), является функцией, которая как бы «скрепляется» с Objective C. В любое время, когда вы хотите сделать что-либо объектно-ориентированное с помощью Objective C, начните работая с методами. (Почти) все остальное - просто синтаксический сахар для вещей, которые вы можете делать с помощью методов.

Концепция частного / защищенного / публичного несколько чужды Задаче C, хотя контроль переменных поддерживается для переменных-членов. Лучшее, что вы можете сделать для методов, это определить их в отдельном заголовке (и это относится к переменным и свойствам класса, если мы реализуем оба с использованием методов).

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