非正式协议和合成对象

2024-02-03 13:18
文章标签 协议 对象 合成 非正式

本文主要是介绍非正式协议和合成对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.非正式协议(informal protocol):使用类别category来实现,非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托, 我们可以使用选择器来判断该非正式协议中是否有这个方法。

非正式协议是NSObject的范畴类,可以认为继承NSObject的类,当然OC所有的类都继承于NSObject类,也就说interface定义的类就是非正式协议。写代码就清楚多了
@interface TestClass
- (void)helloWorld;@end
如果你的.m文件中没有实现helloWorld这个方法的话,它会出警告,但是程序可以照常运行。
正式协议的关键字是protocol,这个感觉要强烈些,但是其实不然,protocol还定义了optional, require,optional类型的可以不用实现这个方法,require类型的函数如果不实现这个方法的话程序会出警告。
@protocol TestClass
@optional- (void)helloWorld1;
@require
- (void)helloWorld2;
@end
现在你可以看一下NSObejct的类,他继承了NSObject这个正式协议。
@interface NSObject <NSObject>
感觉这两个区别不大,但是其实不然,protocal存在的一个重要意义在于:
正式协议(protocal)可以将业务中的方法定义剥离出来,形成一个单独的文件,这跟传统OO中的提取接口是不谋而合的。
如果遇到二个系统需要交换数据,可以制定一套双方都遵守的protocol,然后这二个系统中都把这个协议文件添加到项目中,实现它即可。
这一功能,非正式协议(@interface)就做不到。不信,你可以试试哦。

2.合成对象

已经学习了通过派生子类和分类技术扩展类的定义的击中方式。还有一项技术可以定义一个类包含其他类的一个或多个对象,这个新类的对象就是所谓的合成对象。

当创建子类时,必须确保所有被继承的方法能够正常使用,因为该类的用户可以访问他们。最终子类依赖于父类,改变了父类的有可能会使子类中的方法不能工作。

例如:以前提到,创建一个长方形(Rectangle)类,现在需要创建一个(Square)类,如果让Square继承Rectangle类,那么Square继承了setWidth:andHeight:等方法,但是这并不合适,因为正方形设置边长只需一个参数。可以用如下方式:

@interface Square: NSObject

{

Rectangle *rect;

}

-(void) setSide :(int) s;

-(int) side ;

-(int) area;

-(int) perimeter;

@end

这样Square中不包含Rectangle的方法,但在定义Square中的方法时,可以使用Rctangle中的方法。例如:

-(int) area

{

return [rect area];

}

还有个问题就是如果使用这种方式定义Square类,那么就需要为其包含的Rectangle对象分配内存空间,解决方案就是覆写init方法或者添加initWithSide:之类的新方法来分配空间。

这篇关于非正式协议和合成对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674261

相关文章

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使