Цель-C: как объявить статический член, который виден подклассам? - PullRequest
21 голосов
/ 10 мая 2009

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

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

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

parent.m

@implementation ServerParser

static NSString * currentElement;

но подклассы не видят текущий элемент.

Ответы [ 3 ]

34 голосов
/ 10 мая 2009

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

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

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

@implementation ServerParser

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

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

[ServerParser currentElement];

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

5 голосов
/ 19 июля 2010

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

0 голосов
/ 15 июня 2014

Более просто. Создайте предварительный базовый класс с защищенной статической переменной. Например:

public abstract class preBase {

protected static int VariableStaticPrivate;

}

открытый абстрактный класс Base: preBase {

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

}

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

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

}

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