非正式协议和合成对象

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

相关文章

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{