如何在没有子类化的情况下在构建的类中添加成员变量和方法

时间:2010-03-04 07:02:08

标签: objective-c cocoa

如何在不对其进行子类化的情况下将成员变量和方法添加到内置类(例如,NSString)中。

4 个答案:

答案 0 :(得分:6)

对于方法:您可以使用categories添加成员方法而无需子类化。在Cocoa中,通常的做法是添加每个框架扩展方法。

例如变量:从Snow Leopard(Mac OS X 10.6)开始,您可以使用associative references。您可以使用它们来模拟将对象实例变量添加到现有类中。

Objective-C Programming Language非常全面,可以对关联参考和类别做些什么。

答案 1 :(得分:3)

“类别”允许您向现有类添加方法,但不添加成员变量。

请参阅本教程的相关部分(在页面中搜索):http://cocoadevcentral.com/d/learn_objectivec/ 或者在其他任何地方查找Objective-C文档中的类别。

如果没有子类化,则无法添加实例变量。

答案 2 :(得分:1)

你做不到。有时子类是个坏主意(例如,你可能正在使用类集群),所以人们经常通过创建一个全新的类(NSObject的子类,而不是所讨论的类的子类)来解决这个问题。实例变量,其类型是有问题的类,以及所需的添加变量。

例如,如果您想创建一个NSString的子类,并使用另一个名为“foo”的BOOL ......

@interface StringWithFoo : NSObject
{
    NSString* string;
    BOOL foo;
}

...然后实现你需要的任何方法,或者创建一个公共访问器,这样你就可以直接调用字符串上的方法,甚至可以使用花哨的运行时技巧来适当地转发消息(问一个新的问题,如果那是你想要的做)。

松散地,这是decorator pattern的一个例子。

答案 3 :(得分:0)

您可以通过创建类别将成员方法添加到类而不进行子类化,但这不允许您添加成员变量。

虽然很多东西可以在运行时在objective-c中完成,而这些东西在其他语言中是无法完成的(参见runtime reference)我真的不会建议将一个实例变量添加到现有的课程。

你介意解释你不想要子类的原因吗?子类或类别似乎是最好的事情。