Objective-C 程序设计 第十一章

分类和协议

通过分类以模块的形式向类添加方法。以及如何创建标准化的方法列表提供给他人实现。


分类

给已知类添加功能时,可以考虑新建子类,并实现新方法,使用子类。

更简单的办法,分类。

分类,可以将类的定义模块化到相关方法的组或分类中。

它还提供了扩展现有类的简便方式,并且不必访问类的源代码,也无须创建子类。


语法:

类似于创建一个类。

区别在于: @interface Fraction (MathOps)

这就是创建了一个Fraction的分类MathOps

实现部分可以放在一个实现部分,也可以单独放在一个文件。

@implementation Fraction (MathOps)

文件名称可以考虑Fraction+MathOps.h

如果将分类放到一个主类定义文件中,那么这个类的所有用户都将访问这个分类中的方法。

如果不能直接修改原文件,那就只能选择单独保存分类。


类的扩展

无名分类。

在定义分类时(), 中不写名字。

定义一个像这样的无名分类时,可以使用额外的实例变量和属性来扩展类。只有无名分类可以这样做。

无名分类中声明的方法需要在主实现区域实现。

无名分类非常有用,因为它们的方法都是私有的。如果想将一个方法做成私有的,可以将其放入无名分类。

注意:方法没有在接口部分登记,在这个意义上它们是私有的。然而,如果你知道私有方法的名字,那么也可以调用它。

在实现部分:

@interface Fraction ()

- (void) reduce;

@end


关于分类的注意事项

分类可以覆写该类中的另一个方法,但是很不建议这么做。

1. 覆写之后,再也不能访问之前的方法。如果确实需要覆写的话,使用子类来覆写。可以使用super来访问父类的方法。

通过使用分类添加新方法来扩展类不仅会影响这个类,同时会影响它的所有子类。

同样,对象/分类命名对必须是唯一的。因为Objective-C名称空间是程序代码与所有的库、框架和插件共享的。


协议和代理

协议是多个类共享的一个方法列表。

协议列出了一组方法,有些可以选择实现,有些必须实现。如果采用该协议,就需要遵守。

语法:

@protocol NSCoping

- (id) copyWithZone: (NSZone *)zone;

@end


如果某个类采用某个协议,语法如下:

@interface AddressBook: NSObject <NSCoping>,编译器期望找到AddressBook实现部分的copyWithZone的实现。

如果有多个协议,使用逗号隔开。 <A, B>


如果你定义了自己的协议,那么不必自己实现它。可以告诉别人,如果采用这个协议,则必须实现这些方法。

这些方法可以从超类继承。

如果父类遵守NSCoping协议,那么它的子类也遵守NSCoping,但有可能子类需要自己定制实现。


@protocol NSCoping

- (id) copyWithZone: (NSZone *)zone;

@optionnal

- (void) outline;

@end

optionnal,可以标识选择性实现的方法。@optionnal,可以标识选择性实现的方法。

required,可以列出需要的方法。


注意,协议不引用任何类,它是无类的。

可以使用conformsToProtocol方法检查一个对象是否遵循某项协议。

id obj1;

if ([obj1 conforsToProtocol: @protocol (Drawing)] == YES)

{}

可以使用respondsToSelector测试是否实现了可选的outline方法。


id <Drawing> obj1;   多条协议使用逗号。

通过在类型名称之后的尖括号中添加协议名称,借助编译器来检查变量的一致性。

如果给obj1赋值的对象并不遵守Drawing协议,则会警告。


@protocol Drawing3D <Drawing>

可以扩展协议。表示Drawing3D首先遵守Drawing。


分类也可以遵守某些协议。也可以在实现部分使用无名分类()来进行扩展协议。


代理

协议也是一种两个类之间的借口定义。定义了协议的类可以看作是将协议定义的方法代理给了实现它们的类。

这样,类的定义可以更为通用,因为具体的动作由代理类来承担,响应某些事件或者定义某些参数。


非正式协议,看起来像一个分类。列出了一些方法,而没有实现它们。

非正式协议通常是为根类定义的。有时也被称为抽象协议。

它实际上仅仅是一个名称下的一组方法,在文档说明和模块化方法时,可能有所帮助。

可以使用optional 取代这个非正式协议。


合成对象。

实际是使用组合的方式包装出来一个适合需求的类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Objective-C程序设计(第六版)》是由苹果公司编写的一本关于Objective-C语言的程序设计参考资料。它在第六版中对Objective-C的语法、语义和应用进行了详细的介绍,旨在帮助读者理解和掌握Objective-C编程。 这本参考资料包含了大量的例子和实践项目,可以帮助读者理解Objective-C语法的具体应用。其中涉及到的内容包括:面向对象的编程基本概念、Objective-C中的类、对象和方法、属性和内存管理等方面。通过实际案例的讲解,读者能够更加深入地理解Objective-C编程的原理和技巧。 此外,《Objective-C程序设计(第六版)》还详细介绍了Objective-C的运行时机制和框架,包括如何使用Cocoa Touch框架进行iOS应用程序开发。读者可以通过学习这些内容,了解Objective-C在实际项目中的应用,并掌握与其他技术的集成。 总的来说,这本参考资料是Objective-C编程的重要手册,适合那些想要学习Objective-C语言和iOS应用程序开发的人士阅读。通过学习这本书,读者可以清晰地了解Objective-C的核心概念和编程模式,并掌握相关的实践技巧。如果读者希望深入了解Objective-C语言和开发iOS应用程序,这本参考资料是非常有价值的。 ### 回答2: 《Objective-C程序设计(第六版)》是一本Objective-C编程的参考书籍。本书主要介绍了Objective-C语言的基础知识、面向对象编程的概念和方法、常用的设计模式以及与iOS开发相关的内容。 作为一本参考书籍,本书提供了全面而系统的内容,旨在帮助读者深入了解Objective-C语言的特性和应用。书中详细介绍了Objective-C的语法和语义,包括基本数据类型、控制流程、函数、类、继承、多态等知识点。同时,还介绍了Objective-C的面向对象编程思想,并且通过具体的示例演示了如何使用Objective-C进行开发。 此外,《Objective-C程序设计(第六版)》还涵盖了常用的设计模式,如单例模式、观察者模式、代理模式等,这些设计模式在实际开发中非常实用,能够提高代码的可重用性和可维护性。 对于iOS开发者来说,本书还介绍了一些与iOS开发相关的主题,如Cocoa Touch框架、UIKit控件、界面布局、视图控制器等,这些内容对于理解和使用iOS开发框架非常重要。 总的来说,《Objective-C程序设计(第六版)》是一本非常全面、系统的Objective-C编程参考书籍,适合有一定编程基础的读者阅读和学习。无论是初学者还是有一定经验的开发者,都可以从本书中获得实用的知识和技能,提升自己的编程水平和开发能力。 ### 回答3: Objective-C 程序设计(第六版)是一本非常有价值的参考资料,它可以帮助读者系统地学习和掌握Objective-C程序设计。 首先,这本书首先介绍了Objective-C的基本语法和面向对象编程的原则。它通过易于理解的示例和解释,帮助读者建立起对Objective-C的基本概念和语法的理解。 其次,该书还涵盖了Objective-C的高级特性和高级技术,例如协议、运行时编程和内存管理等。这些内容可以帮助读者深入了解Objective-C的特性和灵活性,并使用它们来进行更复杂的程序设计。 除了语法和特性,该书还提供了关于iOS和macOS平台上应用程序开发的实践指导。它介绍了如何使用Objective-C编写iOS应用程序,包括应用程序的结构、界面设计和数据管理等方面。读者可以通过学习这些内容,了解如何将Objective-C应用于实际项目中,并开发出高质量的应用程序。 此外,该书还提供了大量的示例代码和练习题,读者可以通过动手实践来巩固所学的知识。这些代码和练习题涵盖了从基础知识到高级技术的各个方面,可以帮助读者加深对Objective-C程序设计的理解和运用能力。 总之,Objective-C 程序设计(第六版)是一本很好的参考资料,适合想要学习和掌握Objective-C程序设计的读者。它通过系统的介绍和实践指导,帮助读者全面地了解Objective-C的基础知识、高级特性和应用实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值