Подтвердить что ты не робот

Objective-C: как объявить статический член, видимый для подклассов?

Я объявляю семейство статических классов, которые имеют дело с протоколом связи. Я хочу объявить родительский класс, обрабатывающий общие сообщения, такие как ACK, встроенные ошибки...

Мне нужно иметь статический var, который обрабатывает текущий обрабатываемый элемент, и я хочу объявить его в родительском классе.

Я делаю это так:

parent.m

@implementation ServerParser

static NSString * currentElement;

но подклассы не используют текущий элемент.

4b9b3361

Ответ 1

Если вы объявляете статическую переменную в файле реализации класса, то эта переменная видна только этому классу.

Вы можете объявить статическую переменную в заголовочном файле класса, однако она будет видна для всех классов, которые #import заголовок.

Обходным путем было бы объявить статическую переменную в родительском классе, как вы описали, но также создать метод класса для доступа к переменной:

@implementation ServerParser

static NSString *currentElement;
...
+ (NSString*)currentElement
{
    return currentElement;
}
...
@end

Затем вы можете получить значение статической переменной, вызвав:

[ServerParser currentElement];

Однако переменная не будет видна другим классам, если они не используют этот метод.

Ответ 2

Обходным путем было бы объявить статическую переменную в реализации родительского класса И также объявить свойство в родительском классе. Затем в методах доступа доступ к статической переменной. Таким образом, вы можете получить доступ к статическим переменным, таким как свойства с синтаксисом точек. Все подклассы получают доступ к одной и той же общей статической переменной.

Ответ 3

Проще. Создайте класс pre Base с защищенной статической переменной. Например:

public abstract class preBase {

protected static int VariableStaticPrivate;

}

public abstract class Base: preBase {

//Inherit VariableStaticPrivate
//And you can use it.

}

открытый класс DerivedOne: Base {

//Also inherit VariableStaticPrivate
//And you can use it.

}