非正式协议和合成对象

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

相关文章

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java中实现对象的拷贝案例讲解

《Java中实现对象的拷贝案例讲解》Java对象拷贝分为浅拷贝(复制值及引用地址)和深拷贝(递归复制所有引用对象),常用方法包括Object.clone()、序列化及JSON转换,需处理循环引用问题,... 目录对象的拷贝简介浅拷贝和深拷贝浅拷贝深拷贝深拷贝和循环引用总结对象的拷贝简介对象的拷贝,把一个

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati