当前位置:  开发笔记 > 编程语言 > 正文

Objective-C中的继承和类别有什么区别

如何解决《Objective-C中的继承和类别有什么区别》经验,为你挑选了3个好方法。

有人可以向我解释Objective C中类别和继承之间的区别吗?我已经阅读了维基百科中的条目,并且对类别的讨论与继承没有任何不同.我还在"打开iPhone开发"一书中查看了有关该主题的讨论,但我仍然没有得到它.



1> Abizern..:

有时候,继承似乎比它的价值更麻烦.当您想要向现有类添加某些内容时,可以正确使用该类,该类是该类行为的更改.

使用类别,您只需要现有对象执行更多操作.如前所述,如果您只想拥有一个处理压缩的字符串类,则不需要对字符串类进行子类化,只需创建一个处理压缩的类别.这样,您无需更改已使用的字符串类的类型.

线索是限制类别只添加方法,您不能使用类别向类添加变量.如果类需要更多属性,那么它必须是子类.(编辑:你可以使用关联存储,我相信).

类别是添加功能的好方法,同时符合面向对象的原则,更喜欢组合而不是继承.

编辑2012年1月

现在情况发生了变化.使用当前的LLVM编译器和现代的64位运行时,您可以将iVar和属性添加到类扩展(而不是类别).这使您可以将私有iVars保留在公共接口之外.但是,如果你声明iVars的属性,它们仍然可以通过KVC访问/更改,因为在Objective-C中仍然没有私有方法.


没错,但是仍然没有_add_存储到班级.
应该注意的是,您*可以*使用类别声明现有ivars的属性.我的意思是,你可以在实现中声明一个`@ property`和`@ synthesize`或`@ dynamic`.我用`readonly`属性完成了这个,虽然我想它们可以用于任何事情.也就是说,假设`MyClass`具有`int myVar`,那么`MyClass(MyCategory)`可以具有`myVar`的属性.
@Cthutu是按惯例私有的.如果您尝试调用这样的方法,您将收到编译器警告,但Objective-C是动态的,即使未公开声明,您仍然可以将消息发送给类.当我说没有私人课程时,这就是我的意思.您仍然可以将消息发送给班级.

2> Terry Wilcox..:

类别允许您向现有类添加方法.因此,不是将NSData子类化为添加时髦的新加密方法,而是将它们直接添加到NSData类中.您应用中的每个NSData对象现在都可以访问这些方法.

要了解它的用处,请查看:CocoaDev


它不会自动应用于NSData对象,您仍需要#import定义类别的标题.

3> amrox..:

Objective-c类别最受欢迎的插图之一是NSString.NSString在Foundation框架中定义,它没有视图或窗口的概念.但是,如果你在Cocoa应用程序中使用NSString,你会发现它会响应像这样的消息– drawInRect:withAttributes:.

AppKit为NSString定义了一个类别,它提供了额外的绘图方法.该类别允许将新方法添加到现有类中,因此我们仍然只处理NSStrings.如果AppKit通过子类化实现绘图,我们必须处理'AppKitStrings'或'NSSDrawableStrings'或类似的东西.

类别允许您向现有类添加应用程序或特定于域的方法.它可以非常强大和方便.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有