继承和协议

在zcu102开发板上使用PetaLinux运行Qt程序 请注意,上述步骤只是一个概述,并且可能需要根据特定的开发环境和要求进行适当的调整。如果你是一个初学者或者对于这些领域不太熟悉,建议在尝试之前阅读相关的文档和教程,或者寻求专业人士的帮助。在"Projects"菜单中,选择"Build & Run"选项,并在"Build"步骤中选择正确的工具链。注意:如果Qt程序依赖于其他库文件,需要将这些库文件一起复制到PetaLinux工程的根文件系统目录中,并在Qt程序中正确地配置库文件路径。如果一切顺利,PetaLinux系统将启动,并自动运行Qt程序。 阅读详情

从 C++ 到 Objective-C(7):继承

简单继承

Objective-C 也有继承的概念,但是不能多重继承。不过,它也有别的途径实现类似多重继承的机制,这个我们后面会讲到。

C++

Objective-C

class Foo : public Bar,

            protected Wiz

{

}

@interface Foo : Bar // 单继承

// 如果要同时“继承” Wiz,需要使用另外的技术

{

}

@end

在 C++ 中,一个类可以继承自一个或多个类,使用 public、protected 以及 private 修饰符。子类的函数如果要调用父类的版本,需要使用 :: 运算符,例如 Bar::,Wiz:: 等。

在 Objective-C 中,一个类只能继承一个父类,并且只能是 public 的(这和 Java 是一致的)。同样类似 Java,如果你要在子类中调用父类的函数,需要使用 super。

多重继承

Java 同样不允许多重继承。但是它提供了 interface 来模拟多重继承。类似的,Objective-C 也有同样的机制,这就是协议 protocol和分类 categories。我们将在后面的内容详细讲述这两种技术。

虚拟性

虚方法

在 Objective-C 中,所有方法都是虚的,因此,没有 virtual 关键字或其等价物。

虚方法重定义

在 Objective-C 中,你可以定义一个没有在 @interface 块里面声明的方法。但这并不是一种替代 private 的机制,因为这种方法实际是能够被调用的(回想下,Objective-C 中方法的调用是在运行期决定的)。不过,这确实能够把接口定义变得稍微干净了一些。

这并不是一种坏习惯,因为有时你不得不重定义父类的函数。由于所有方法都是虚的,你无需像 C++ 一样在声明中显式写明哪些函数是 virtual 的,这种做法就成为一种隐式的重定义。很多继承西 NSObject 的方法都是是用这种方法重定义的。例如构造方法 init,析构方法 dealloc,view 类的 drawRect: 等等。这样的话,接口就变得更简洁,更易于阅读。不好之处就是,你不能知道究竟哪些方法被重定义了。

纯虚方法则是使用正式协议 formal protocols 来实现。

虚继承

Objective-C 中不允许多重继承,因此也就没有虚继承的问题。

协议

Java 和 C# 使用接口 interface 的概念来弥补多重继承的不足。Objective-C 也使用了类似的机制,成为协议 protocol。在 C++ 中,这种概念是使用抽象类。协议并不是真正的类:它只能声明方法,不能添加数据。有两种类型的协议:正式的 formal 和非正式的 informal。

正式协议

正式协议的方法,所有实现这个协议的类都必须实现。这就是一种验证,也就是说,只要这个类说实现这个协议,那么它肯定可以处理协议中规定的方法。一个类可以实现任意多个协议。

C++

class MouseListener

{

public:

    virtual bool mousePressed(void) = 0; // 纯虚方法

    virtual bool mouseClicked(void) = 0; // 纯虚方法

};

 

class KeyboardListener

{

public:

    virtual bool keyPressed(void) = 0; // 纯虚方法

};

 

class Foo : public MouseListener,  public KeyboardListener {...}

// Foo 必须实现 mousePressed, mouseClicked 和 keyPressed

// 然后 Foo 就可以作为鼠标和键盘的事件监听器

Objective-C

@protocol MouseListener

 

-(BOOL) mousePressed;

-(BOOL) mouseClicked;

 

@end

 

@protocol KeyboardListener

 

-(BOOL) keyPressed;

 

@end

 

@interface Foo : NSObject <MouseListener, KeyboardListener>

{

...

}

@end

// Foo 必须实现 mousePressed, mouseClicked 和 keyPressed

// 然后 Foo 就可以作为鼠标和键盘的事件监听器

C++ 中,协议可以由抽象类和纯虚函数实现。C++ 的抽象类要比 Objective-C 的协议强大的多,因为抽象类可以带有数据。

Objective-C 中,协议是一个特殊的概念,使用尖括号 <…> 表明。注意,尖括号在 Objective-C 中不是模板的意思,Objective-C 中没有类似 C++ 模板的概念。

一个类也可以不经过协议声明,直接实现协议规定的方法。此时,conformsToProtocol: 方法依然返回 NO。出于性能考虑,conformsToProtocol: 方法只检查类接口的声明,不会一个方法一个方法的对比着检查。conformsToProtocol: 的返回值并不会作为是否调用方法的依据。下面是这个方法的原型:

-(BOOL) conformsToProtocol:(Protocol*)protocol

// Protocol 对象可以由 @protocol(协议名) 返回

实现了正式协议的对象的类型同协议本身是兼容的。这一机制可以作为协议的筛选操作。例如:

// 下面方法是 Cocoa 提供的标准方法

// 方法参数可以是任意类型 id,但是必须兼容 NSDraggingInfo 协议

-(NSDragOperation) draggingEntered:(id )sender;

可选方法

有时我们需要这么一种机制:我们的类需要实现一部分协议中规定的方法,而不是整个协议。例如在 Cocoa 中,代理的概念被广泛使用:一个类可以给定一个辅助类,由这个辅助类去完成部分任务。

一种实现是将一个协议分割成很多小的协议,然后这个类去实现一个协议的集合。不过这并不具有可操作性。更好的解决方案是使用非正式协议。在 Objective-C 1.0 中就有非正式协议了,Objective-C 2.0 则提出了新的关键字 @optional 和 @required,用以区分可选方法和必须方法。

@protocol Slave

 

@required // 必须部分

-(void) makeCoffee;

-(void) duplicateDocument:(Document*)document count:(int)count;

 

@optional // 可选部分

-(void) sweep;

 

@required // 又是一个必须部分

-(void) bringCoffee;

@end

非正式协议

非正式协议并不是真正的协议,它对代码没有约束力。非正式协议允许开发者将一些方法进行归类,从而可以更好的组织代码。所以,非正式协议并不是协议的宽松版本。另外一个相似的概念就是分类。

让我们想象一个文档管理的服务。假设有绿色、蓝色和红色三种文档,一个类只能处理蓝色文档,而 Slave 类使用三个协议 manageBlueDocuments, manageGreenDocuments 和 manageRedDocuments。Slave 可以加入一个分类 DocumentsManaging,用来声明它能够完成的任务。分类名在小括号中被指定:

@interface Slave (DocumentsManaging)

 

-(void) manageBlueDocuments:(BlueDocument*)document;

-(void) trashBlueDocuments:(BlueDocument*)document;

 

@end

任何类都可以加入 DocumentsManaging 分类,加入相关的处理方法:

@interface PremiumSlave (DocumentsManaging)

 

-(void) manageBlueDocuments:(BlueDocument*)document;

-(void) manageRedDocuments:(RedDocument*)document;

 

@end

另一个开发者就可以浏览源代码,找到了 DocumentsManaging 分类。如果他觉得这个分类中有些方法可能对自己,就会检查究竟哪些能够使用。即便他不查看源代码,也可以在运行时指定:

if([mySlave respondsToSelector:@selector(manageBlueDocuments:)])

    [mySlave  manageBlueDocuments:document];

严格说来,除了原型部分,非正式协议对编译器没有什么意义,因为它并不能约束代码。不过,非正式协议可以形成很好的自解释性代码,让 API 更具可读性。

全志F1C200S嵌入式驱动开发(lcd屏幕驱动) 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信号方面,常见的格式有RGB888、RGB666、RGB565。为什么有什么多选择,主要还是取决于soc pin脚的多少来定。当然,pin脚越多,显示的颜色就越精准,还原度就越高。 举例来说,假设 阅读详情

相关推荐

ArduPilot 的 RTOS 选择:为何 ChibiOS 成为现代飞控的首选

本文深入探讨了ArduPilot选择ChibiOS作为现代飞控首选RTOS的原因。通过对比FreeRTOS和NuttX,ChibiOS凭借其50ns中断响应、1.2μs上下文切换时间和高效的资源管理脱颖而出,特别适合处理无人机飞控中的高频传感器融合和实时控制任务。文章还详细分析了ChibiOS在STM32硬件上的优化实践及其在无人机开发中的显著优势。

weixin_29161719的博客 567

继承和协议的关系

// 不同点 /* 协议: a.协议中不可以声明变量,只能声明方法 (遵守协议的类实现方法) b.一个类可以遵守多个协议,实现类似C++的多继承 继承: a.继承中可以声明成员变量和方法,子类继承父类之后,子类会继承父类所拥有的成员变量和成员方法,子类可以不写父类的方法

CharlesYaoxin的博客 598

汽车以太网- IEEE 802.3标准

关于汽车以太网,大家看到最多的标准大概就是IEEE802.3bw,也就是我们车内使用的百兆以太网,专业称呼是100BASE-T1,该标准是车内百兆以太网的物理层协议,是我们学习汽车以太网必须要了解的协议。在正式了解协议之前,我们先介绍下什么是IEEE802.3标准。............

weixin_39974126的博客 7107

协议和继承的关系

/// 如果一个类遵守了协议,那么这个类的实例对象也就遵守了协议,具备了协议中的行为 // 协议规范了IosProgrammer类的行为 // 一旦遵守这个协议,协议中的方法就不需要声明,直接实现 @protocol IosCoderProtocol // @protocol 协议名字 @protocol NSObject // 基协议 // 自定义的协议都要遵守 协议 基协议 // Io

CharlesYaoxin的博客 1636

电力电子论文(TPE、TTE)投稿经验分享

电力电子顶刊论文投稿经验

橙子的博客 2万+

研究生如何快速发CVPR

研究生如何快速发CVPR,找到科研方向

python_vb的博客 785

iOS 协议代理的继承和扩展

在编码时,为了部分代码复用,可能会用带继承关系,有时,父类的协议代理有限,需要我们在继承的同时,扩展父类的协议方法。此时,存在两种选择: 1、在父类代理协议delegate 的基础上扩展新方法。如UIKit框架中,UITableView 继承自UISCrollView ,同时他们都有同名的Delegate 属性,UITableView的Delegate是在UISCrollView的基础上扩展

iOS学堂 5918

Hindsight 内存爆炸 4 个词排查清单:9,284 条 6 成是 SSH 调试日志——Agent 标签系统的实战复盘

9,284 条记忆里 66% 是 SSH 调试日志。4 个标签被滥用=0 区分度。3 个 entity_labels + retain_mission + retain_every_n_turns 配置把噪声压回 5%——附 PATCH 脚本和实测前后数据。

Starry-SkyJing的博客 57

objective C中继承、协议、分类和多态的实现

第一、objective C中继承的实现 在oc中只有实例变量会有权限控制,实例方法和类方法是没有权限控制的,这点与c++不同,OC默认的是protected,并且在声明权限控制时,没有分号 在OC中可以像C++一样用指针运算法来访问实例变量 Rectangle.h 文件代码: #import @interface Rectangle : NSObject {     in

richard_如风的专栏 2182

Qt入门教程【基础控件篇】QLineEdit输入框

QLineEdit输入框

小鱼酱的博客 3261

Hermes Agent 常见报错排查与问题解决

Hermes Agent 常见报错排查指南 摘要 本文全面梳理了 Hermes Agent 使用过程中的10类常见报错,按阶段划分为安装期、运行期认证类、后端基础设施类和长任务执行类四大类,并提供了系统化的排查流程: 安装期问题:包括命令未找到和Python版本不兼容,主要检查PATH环境和Python版本是否符合要求 认证类问题:涉及API Key认证失败和速率限制,需要验证密钥配置和配额状态 基础设施问题:包含Docker报错、MCP连接失败和OAuth令牌过期,需检查相关服务状态 执行类问题:主要是上

简简单单Onlinezuozuo 1345

iOS开发中关于继承、扩展和协议的理解

OC中protocol、category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下。 利用继承,多态是一个很好的保持“对扩展开放、对更改封闭”(OCP)的办法,也是最常见的一种方法。Objective C还支持另外两种语法来支持OCP:Protocol和Category。Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract cl

志存高远 2076

【后量子密码】SPHINCS+ 算法(二):签名与验签(附源码分析)

本节介绍SPHINCS+ 算法的密钥生成、签名与验签。nnn:安全参数;www:Winternitz参数,WOTS+签名分解的基底;hhh:超树的高度;ddd:超树中子树的层数;kkk:FORS 树的数量;ttt:FORS 树的叶子节点数。

听雨草堂 4680

关于 继承、扩展和协议,深度好文

OC中protocol、category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下。利用继承,多态是一个很好的保持“对扩展开放、对更改封闭”(OCP)的办法,也是最常见的一种方法。Objective C还支持另外两种语法来支持OCP:Protocol和Category。Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract class的

openglnewbee的博客 2004

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

iOS设计模式学习 (二) OC协议之接口继承和代理设计

大多数情况下我们在说Objective-C 的协议protocol时,我们首先想到的都是iOS中的重要设计模式——代理设计模式。在前面一节的学习中已经说到了代理设计模式,这儿就只简单的说一下:在代理设计模式中,我们使用到的都是协议的接口方法,协议定义了对象间的访问接口规则。但是,其实协议同样拥有属性,这就涉及到下面我们要说的接口继承。所谓接口继承,学过C++的应该都知道抽象类,其实通过继承抽象类,然

SakuraBurial的专栏 921

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

从头开始快速学习:继承和协议

如果您已经阅读了本系列的上一课,那么现在您应该已经对Swift编程语言的基础有了很好的了解。 我们讨论了变量,常量和函数,在上一课中,我们介绍了Swift中面向对象编程的基础。 虽然游乐场是与Swift一起玩并学习语言的好工具,但现在该继续并在Xcode中创建我们的第一个Swift项目了。 在本课程中,我们将使用Xcode和Swift创建一个简单的待办应用程序的基础。 在此过程中,我们将学...

代码教主 235

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ios学习笔记(二)之Objective-C类、继承、类别和协议 - superlucky

ios学习笔记(二)之Objective-C类、继承、类别和协议 - superlucky

xiacsd的专栏 857

多态 主要由继承和协议来实现

判断标准 协议只是定义空方法 继承有默认实现方法 // main.m // 多态 #import <Foundation/Foundation.h> #import "Animal.h" #import "Cat.h" #import "Tiger.h" #import "Person.h" /*多态 //1.一种方法有多种不同的实现 //例如 An...

weixin_30376453的博客 120

优先级继承 linux,linux内核的优先级继承协议(pip)和μC/OSII 2.52内核的优先级置顶协议(pcp)...

在实时系统中,不确定的阻塞是尽力要避免的,因为这可能影响到任务的实时性,在常规的系统中,如果一个低优先级的任务占有了一个独占式资源,那么高优先级任务请求该资源时必然要阻塞,这是可以的,因为系统相信这个低优先级的任务总会释放该资源的,但是在实时系统中,即使再相信资源总会被释放,实时的要求也 不允许任务被长时间的阻塞,更糟糕的是不确定时长的阻塞,那么就有必要让低优先级任务尽快完成任务释放资源,在实施中...

weixin_39942492的博客 469

优先级反转,优先级继承和优先级天花板协议

简单介绍了优先级反转的情况,以及优先级继承和原始优先级天花板协议这两种解决方案。

F_Arisa的博客 2101

linux内核的优先级继承协议(pip)和μC/OSII 2.52内核的优先级置顶协议(pcp)

在实时系统中,不确定的阻塞是尽力要避免的,因为这可能影响到任务的实时性,在常规的系统中,如果一个低优先级的任务占有了一个独占式资源,那么高优先级任务请求该资源时必然要阻塞,这是可以的,因为系统相信这个低优先级的任务总会释放该资源的,但是在实时系统中,即使再相信资源总会被释放,实时的要求也 不允许任务被长时间的阻塞,更糟糕的是不确定时长的阻塞,那么就有必要让低优先级任务尽快完成...

weixin_33804582的博客 281

ios学习笔记(二)之Objective-C类、继承、类别和协议

二:Objective-C类与继承和协议 在前面已经提过了对象的初始化,这里首先讲的是变量。 2.1 变量 局部变量(内部变量):局部变量是在方法内作定义说明的,其作用域仅限于方法内,离开方法后使用这种变量是非法的。 全局变量(外部变量): 其作用域是整个源程序。说明符是extern。例如: extern int intX; ...

weixin_30724853的博客 153

swift5.1学习-9.继承,可选链,协议

1.继承(Inheritance) 值类型(枚举、结构体)不支持继承,只有类支持继承 n 没有父类的类,称为:基类 Swift并没有像OC、Java那样的规定:任何类最终都要继承自某个基类 子类可以重写父类的下标、方法、属性,重写必须加上override关键字 2.重写实例方法、下标 被class修饰的类型方法、下标,允许被子类重写 被static修饰的类型方法、下标,不允许被子类重写 class Animal { func speak() { print("Animal s

qq_31421983的博客 501
上一篇: Object-C 相关知识
下一篇: 20款针对开发者的移动开发框架
Enbiting
博客等级 码龄18年 19粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值