在Objective-C中模拟公共/受保护的静态变量

时间:2011-09-07 18:27:52

标签: objective-c oop static class-variables

这个SA问题的最高投票答案(Objective C Static Class Level variables)非常清楚地概述了我的问题但是,我想再增加一个标准:

问题描述

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

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

  5. 甚至更好

    4A。 我希望ClassA的方法按原样访问类变量,在ClassASub中重写

    有什么想法吗?或者这只是将Objective-C弯曲一步太远了?

1 个答案:

答案 0 :(得分: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实例上运行。

将任何类型的变量附加到对象(类或实例)的想法是一种对目标C“固定”的特性。任何时候你想要使用Objective C做任何面向对象的事情,启动通过使用方法。 (几乎)所有其他东西都只是你可以用方法做的事情的语法糖。

私有/受保护/公共的概念与目标C有些陌生,即使成员变量支持访问控制。你可以为方法做的最好的事情是在一个单独的头文件中定义它们(如果我们同时使用两种方法,这适用于类变量和属性)。