如何在不对其进行子类化的情况下将成员变量和方法添加到内置类(例如,NSString)中。
答案 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)我真的不会建议将一个实例变量添加到现有的课程。
你介意解释你不想要子类的原因吗?子类或类别似乎是最好的事情。