有人可以向我解释Objective C中类别和继承之间的区别吗?我已经阅读了维基百科中的条目,并且对类别的讨论与继承没有任何不同.我还在"打开iPhone开发"一书中查看了有关该主题的讨论,但我仍然没有得到它.
有时候,继承似乎比它的价值更麻烦.当您想要向现有类添加某些内容时,可以正确使用该类,该类是该类行为的更改.
使用类别,您只需要现有对象执行更多操作.如前所述,如果您只想拥有一个处理压缩的字符串类,则不需要对字符串类进行子类化,只需创建一个处理压缩的类别.这样,您无需更改已使用的字符串类的类型.
线索是限制类别只添加方法,您不能使用类别向类添加变量.如果类需要更多属性,那么它必须是子类.(编辑:你可以使用关联存储,我相信).
类别是添加功能的好方法,同时符合面向对象的原则,更喜欢组合而不是继承.
编辑2012年1月
现在情况发生了变化.使用当前的LLVM编译器和现代的64位运行时,您可以将iVar和属性添加到类扩展(而不是类别).这使您可以将私有iVars保留在公共接口之外.但是,如果你声明iVars的属性,它们仍然可以通过KVC访问/更改,因为在Objective-C中仍然没有私有方法.
类别允许您向现有类添加方法.因此,不是将NSData子类化为添加时髦的新加密方法,而是将它们直接添加到NSData类中.您应用中的每个NSData对象现在都可以访问这些方法.
要了解它的用处,请查看:CocoaDev
Objective-c类别最受欢迎的插图之一是NSString.NSString在Foundation框架中定义,它没有视图或窗口的概念.但是,如果你在Cocoa应用程序中使用NSString,你会发现它会响应像这样的消息– drawInRect:withAttributes:
.
AppKit为NSString定义了一个类别,它提供了额外的绘图方法.该类别允许将新方法添加到现有类中,因此我们仍然只处理NSStrings.如果AppKit通过子类化实现绘图,我们必须处理'AppKitStrings'或'NSSDrawableStrings'或类似的东西.
类别允许您向现有类添加应用程序或特定于域的方法.它可以非常强大和方便.