【发布时间】:2011-08-23 09:55:50
【问题描述】:
对于可以被子类“覆盖”的类变量,Objective-C 中的一个很好的模式是什么?
常规类变量通常在 Objective-C 中使用文件本地静态变量以及定义为类方法的公开访问器来模拟。
但是,与任何 Class 变量一样,这意味着该值在该类及其所有子类之间共享。有时,子类只为自己更改值是很有趣的。这通常是使用类变量进行配置时的情况。
这里有一个例子:在一些 iOS 应用程序中,我有许多给定公共抽象超类(注释)的对象,这些对象有许多具体的变体(子类)。所有注释都用标签以图形方式表示,标签颜色必须反映其注释的特定种类(子类)。所以所有的Foo注解都必须有一个绿色的标签,所有的Bar注解都必须有一个蓝色的标签。在每个实例中存储标签颜色会很浪费(实际上,可能是不可能的,因为我有很多对象,而且每个实例共有的实际配置数据远大于单一颜色)。
在运行时,用户可以决定现在所有的 Foo 注释都将带有红色标签。以此类推。
由于在 Objective-C 中,类是实际的对象,这需要将 Foo 标签颜色存储在 Foo 类对象中。但这可能吗?这种事情的好模式是什么?当然,可以定义某种全局字典,将类映射到其配置值,但这有点难看。
【问题讨论】:
-
为什么不简单地覆盖子类中的类方法?
-
然后返回另一个常量?那么用户如何更改 Foo 标签颜色呢?在那种情况下返回另一个全局的值?那么对于每个子类,您定义的新全局变量与配置变量一样多吗?是的,我猜它会起作用。但是很丑。
-
Obj-C 没有真正的类变量。查看 Objective-C 编程语言指南中的 Variables and Class Objects chapter 了解一些可以使用的模式。
-
我知道那个文件。正如我所写的,虽然语言中缺少常规类变量,但使用全局变量很容易模拟。但这不是我在这里所追求的。我正在寻找模拟类实例变量的模式,您引用的文档甚至没有提及也没有以任何方式承认(AFAICS)。
-
我不确定它们是否适用于类对象,但也许associative references 可能是模拟这些对象的一种方式。
标签: objective-c class variables objective-c-runtime class-instance-variables