非正式协议和合成对象

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

相关文章

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

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja