1

这个 SA 问题( Objective C Static Class Level variables)的最高投票答案很好地概述了我的问题,但我想再添加一个标准:

问题描述

  1. 你希望你的 ClassA 有一个 ClassB 类变量。
  2. 您正在使用 Objective-C 作为编程语言。
  3. Objective-C 不像 C++ 那样支持类变量。

  4. 我想从子类 ClassASub 访问 ClassA 的类变量

甚至更好

4a。我希望 ClassA 的方法按原样访问类变量,在 ClassASub 中被覆盖

有任何想法吗?或者这只是将Objective-C弯曲了一步吗?

4

1 回答 1

1

只需为您的类变量创建一个普通的 getter 方法,您就可以在子类中覆盖它。只要记住通过方法访问它。

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 做任何面向对象的事情,从使用方法。(几乎)其他一切都只是你可以用方法做的事情的语法糖。

尽管成员变量支持访问控制,但私有/受保护/公共的概念对 Objective C 来说有些陌生。您可以为方法做的最好的事情是在单独的标头中定义它们(如果我们使用方法实现这两者,这适用于类变量和属性)。

于 2011-09-07T18:56:35.143 回答