当前位置: 首页 > news >正文

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念,概念上简单来讲类是它是一组关系密切属性的集合,所谓的关系就是对现实事物的抽象。

  • 上面提到的关系包括很多种,比如has a, is a,has some等;
  • 关系是一种抽象过程,源于对事务的理解,同时还要平衡开发的成本,这是一门艺术;

类的结构

OOP标准结构

下图是一张通用的类完整结构图表示,本章暂时只讲最基础的部分,后续章节会围绕这个基础逐渐深入展开。
在这里插入图片描述
几点需要说明下:

  1. 在OOP世界中,所有的类都有一个默认的父类,一般称为基类。比如java里的基类名为Object,ObjectiveC中的基类名称为NSObject。
  2. OOP中不允许多继承,ObjC也不例外;
  3. 协议可以实现多个,即一个类可以实现多种不同的协议;

OOP在ObjC中的实现

ObjectiveC中的代码实现模式:
在这里插入图片描述
几点需要说明下:

  1. 在ObjectiveC中,会把一个类拆分成两个文件接口(.h)和实现(.m)。
  2. ObjectiveC中的文件只是一个载体,具体的定义是由关键标识来定义的,比如在一个.h文件中可以定义多个接口定义;在一个.m文件中也可以定义多个接口的实现

在同一个.m文件中书写全部的代码,这种方式并不推荐,因为会给维护带来很大问题。

#import <Foundation/Foundation.h>
// ----------------------类声明----------------------------
@interface Fraction : NSObject
@end // Tire// -----------------------类实现---------------------------
@implementation Fraction- (NSString *) description
{return (@"I am a tire. I last a while");
} // description@end // Tire// -----------------------main入口函数---------------------------
int main(int argc, const char * argv[]) {@autoreleasepool {Fraction *engine = [Fraction new];}return 0;
}// main

所以推荐的类组织方式是:

分离接口和实现

把@interface和@implementation代码定义在同一个.m文件中,这种方式呢做练习用还可以,如果是正式的程序就不太方便了。因为这样的话在代码行数比较多时维护会是个大总是,所以最好的方法是分离接口和实现,实现分而治之,如下:
在这里插入图片描述

创建类文件

使用XCode工具,在“New File时”选择Cocoa class创建文件时会自动分离.h和.m,如下图所示:
在这里插入图片描述
在下一步窗口中添填写新创建的类名称,也可以选择需要继承的父类(父类可以是自定义的类):
在这里插入图片描述
最后设置文件存放目录,也可以设置目标和群组,复杂的项目可以有多个组和目标:
在这里插入图片描述

  • Group:Group主要是用于管理项目的源文件,比如可以创建两个Group,一个用于存放UI文件,一个用于存放处理程序类。Group不是java中package的概念,它是XCode的一个逻辑分组并不会真正的移动文件位置,甚至可以让Group指向磁盘上某个特定的文件夹;
  • Target:简单可理解应用编译后的运行环境,比如一个IOS程序,其可以设置多个不同的目标如iphone12、iphone13等,每个目标采用不同的配置,这样也比较方便测试其兼容性;

.h类声明实现

相当于类功能的描述,默认格式上文件名与类名相同。在.h文件中一般用于定义类的@interface指令、公共的struct定义、enum常量、#defines和extern全局变量。新创建一个Fraction.h文件,代码示例如下:

#import <Foundation/Foundation.h>@interface Fraction : NSObject-(void) print;@end //end Fraction

.m类功能实现

相当于类功能的实现,默认格式上文件名与类名相同。在.m一般用于定义类的@implementation指令、私有的struct定义、extern全局变量定义。新创建一个Fraction.m文件

如果创建的是以.mm为后缀的文件则可以同时使用C++和ObjectiveC语法,示例代码如下:

#import "Fraction.h"@implementation Fraction {//私有属性int numerator;int denominator;
}
- (void) print {NSLog(@"%i / %i", numerator, denominator);
}- (void) setNumerator:(int) n {numerator = n;
}- (void) setDenominator:(int) d {denominator = d;
}
@end

分离后的代码会有如下特点:

  1. 在@interface中引入的头文件,可直接继承到@implementation实现中不必重复导入,比如在.h文件中import <Foundation/Foundation.h>,则.m文件中就不需要再写一遍了(虽然可以);
  2. 在 @implementation 实现中也可以定义 @interface 中未出现过的方法和变量,但要注意不要和.h文件中定义的变量名重复;
  3. 在@implementation或@interface中定义的方法的参数名称尽量不要和自定义的变量重名,所以给变量前面加上self是一个非常好的习惯,比如下列代码;
//声明部分
-(void) setNumerator: (int) name;//实现部分
NSString *name;
- (void) setDenominator:(int) name {name = name;//上面这行代码必须替换为如下代码,否则会发生错误self.name = name;
}

类的实例化

类可以通过new或alloc关键字实现实例化,类的实例化是一大块内容,本节只需简单了解其使用调用,如果用XCode创建工程,则会默认生成一个名为main.m的文件,里面包含一个main方法(注意:一个工程只允许存在一个main()方法)。

// -----------------------main入口函数---------------------------
int main(int argc, const char * argv[]) {@autoreleasepool {Fraction *engine = [[Fraction alloc] init];}return 0;
}

类的组合

上述就是最简单类的实现,下面看到类封装的基本用法。也是一种最简单的设计模式组合。比如描述一辆汽车:
在这里插入图片描述
对象组合其实是一种设计思想,并不是一种技术框架实现。类的扩展有分类和协议两种技术,另一种技术就是合成对象,它可以定义一个类包含其他类的一个或多个对象,这个新类就是所谓的合成对象。即手动处理,比如父子类的实现可修改成如下代码:

@interface Car: NSObject{Tires *tires[4]; //4条轮胎Engine *engine; //1个引擎
}@interface Tires: NSObject{int par; //标准的气压值int position;//安装位置
}@interface Engine: NSObject{NSString *name; //引擎名称
}

相关文章:

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念&#xff0c;概念上简单来讲类是它是一组关系密切属性的集合&#xff0c;所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种&#xff0c;比如has a&#xff0c; is a&#xff0c;has some等&…...

Qt 总结

由于工作需要用到Qt。把过程中学习到的东西记录下来&#xff0c;希望能帮到他人和将来的自己。 由于需要快速实现需求&#xff0c;所以对Qt只是使用&#xff0c;并没有对原理的深入理解。 故此文只适合入门&#xff0c;不适合深入学习Qt。 文章目录 安装&维护示例&教…...

中间件复习之-RPC框架

什么是RPC框架&#xff1f; RPC(Remote Procedure Call):远程过程调用。当多个应用部署在多个服务器上时&#xff0c;由于他们不在一个内存空间上&#xff0c;因此需要网络来进行通信&#xff0c;而RPC允许它像调用本地方法一样调用远程服务。 RPC原理 服务消费方通过RPC客户…...

AcWing 787. 归并排序——算法基础课题解

AcWing 787. 归并排序 文章目录 题目描述CGo模板 题目描述 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n。 第二行包含 n 个整数&#xff08;所有…...

力扣1379---找出克隆二叉树的相同节点(Java、DFS、简单题)

目录 题目描述&#xff1a; 思路描述&#xff1a; 代码&#xff1a; &#xff08;1&#xff09;&#xff1a; &#xff08;2&#xff09;&#xff1a; 题目描述&#xff1a; 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0c;以及一个位于原始树 ori…...

FLink学习(三)-DataStream

一、DataStream 1&#xff0c;支持序列化的类型有 基本类型&#xff0c;即 String、Long、Integer、Boolean、Array复合类型&#xff1a;Tuples、POJOs 和 Scala case classes Tuples Flink 自带有 Tuple0 到 Tuple25 类型 Tuple2<String, Integer> person Tuple2.…...

Failed to resolve import “Home/components/HomeNew.vue“. Does the file exist?

错误信息 [plugin:vite:import-analysis] Failed to resolve import "/apis/home.js" from "src/views/Home/components/HomeNew.vue". Does the file exist? 错误原因 路径错误 解决方法...

《价值》-张磊-高瓴资本-3-建立人脉和信任;顺应趋势,把握机遇;

第三章 价值投资初试炼 2005.6.1 创办高瓴资本 许多人问我为什么一直在创业&#xff0c;其实我倒没想到自己非要创业成功不可&#xff0c;只是觉得一定要做点事&#xff0c;做点有意义的事。归根到底&#xff0c;可能是“爱折腾&#xff0c;不满足现状&#xff0c;爱挑战自己”…...

游戏引擎中的物理应用

一、 角色控制器 Character Controller和普通的动态对象&#xff08;Dynamic Actor &#xff09;是不同的&#xff0c;主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力&#xff08;可以站停在位置上&#xff09;&#xff0c;没有弹性加速和刹车几乎立即…...

复现k8s黄金票据学习

1.什么是黄金票据 在 Kubernetes 中&#xff0c;"黄金票据"并不是一个常见的术语。可能你想了解的是服务账户&#xff08;Service Account&#xff09;。服务账户是 Kubernetes 中用于身份验证和授权的一种机制。它们允许 Pods 或其他工作负载在 Kubernetes 集群中与…...

08-JavaScript BOM定时器及JS动画

1. 设置定时器 1.1设置超时定时器 超时调用需要使用window对象的setTimeout()方法&#xff0c;该方法接受两个参数&#xff1a;调用函数或计算表达式和以毫秒为单位的时间&#xff08;即在执行代码前需要等待多少毫秒&#xff09;。 //setTimeout(callback, after) //callba…...

边缘计算盒子与云计算:谁更适合您的业务需求?

边缘计算盒子和云计算&#xff0c;这两个概念听起来可能有点复杂&#xff0c;但其实它们就是两种不同的数据处理方式。那谁更适合您的业务需求呢&#xff1f;咱们来详细说说。 边缘计算盒子&#xff0c;就像是个小型的数据处理中心&#xff0c;放在离你业务现场比较近的地方。它…...

浅聊什么是Redis?

需求&#xff1a;MySQL面临大量的查询&#xff0c;即读写操作&#xff0c;因此类比CPU&#xff0c;给数据加缓存&#xff0c;Redis诞生。应用程序从MySQL查询的数据&#xff0c;在Redis设置缓存&#xff08;记录在内存中&#xff0c;无需IO操作&#xff09;&#xff0c;后再需要…...

java算法day43 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 核心思想&#xff1a; 尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最小&#xff0c;这样就化解成01背包问题了。 是不是感觉和昨天讲解的416. 分割等和子集 (opens new window)非常像了。那么分成两堆石头&#xff0c;一堆石头的…...

练气第六天

问:ANR怎么分析&#xff1f; ANR问题&#xff0c;这其实是一个非常综合性的问题&#xff0c;因为anr会涉及CPU负载&#xff0c;内存空间大小&#xff0c;线程锁&#xff0c;GC回收&#xff0c;这里面每个点&#xff0c;都是非常考验我们基本功的。 分析ANR问题&#xff0c;需…...

认识 Redis 与 分布式

Redis 官网页面 Redis官网链接 Redis 的简介 Redis 是一个在内存中存储数据的中间件 一方面用于作为数据库&#xff0c;另一方面用于作为数据缓存&#xff0c;适用于分布式系统中 Redis 基于网络&#xff0c;进行进程间通信&#xff0c;把自己内存中的变量给别的进程&#xf…...

Linux初学(十二)AWK进阶

一、AWK 1.1 简介 AWK是Linux中重要的文本处理工具Linux三剑客只一处理的对象可以是一个具体的文件&#xff0c;也可以是一个命令的执行结果AWK按行读取文件&#xff0c;将每一行视为一条记录 案例一&#xff1a;获取系统中每个用户的uid 方法一&#xff1a;cat /etc/passwd |…...

文字识别 Optical Character Recognition,OCR CTC STN

文字识别 Optical Character Recognition,OCR 自然场景文本检测识别技术综述 将图片上的文字内容,智能识别成为可编辑的文本。 场景文字识别(Scene Text Recognition,STR) OCR(Optical Character Recognition, 光学字符识别)传统上指对输入扫描文档图像进行分析处理,识…...

四、MySQL读写分离之MyCAT

一、读写分离概述 1、什么是读写分离&#xff1a; 读写分离&#xff1a;就是将读写操作分发到不同的服务器&#xff0c;读操作分发到对应的服务器 &#xff08;slave&#xff09;&#xff0c;写操作分发到对应的服务器&#xff08;master&#xff09; ① M-S (主从) 架构下&…...

通讯录项目实现

引言&#xff1a;通过顺序表的逻辑实现通讯录。这里就不讲关于顺序表的函数了。如果有不明白的可以看我写的顺序表的博客。 目录 顺序表与通讯录的比较 各源文件文件大榄 Contact.c中通讯录相关函数的定义 初始化和销毁通讯录 添加联系人&#xff1a; 删除联系人&#xf…...

xss相关知识点与绕过思路总结

前言 对xss的绕过进行了系统的学习与实践后&#xff0c;重新审视一下xss&#xff0c;对他的绕过进行一个总结。 &#xff08;当然我也是个小白&#xff0c;这些也是我当时瞎鸡儿乱搞绕过了几个xss自己做的小总结&#xff09; 可能有点丑陋&#xff0c;献丑了。 好博客推荐 …...

深入解析语言模型:原理、实战与评估

引言 随着人工智能的飞速发展&#xff0c;语言模型作为自然语言处理&#xff08;NLP&#xff09;的核心技术之一&#xff0c;日益受到业界的广泛关注。本文旨在深入探讨语言模型的原理、实战应用以及评估方法&#xff0c;帮助读者更好地理解和应用这一技术。 一、语言模型原理…...

Elasticsearch 的索引优化常规项

优化常规项 https://blog.csdn.net/bairo007/article/details/132019575 1、按实际情况适当调整主分片的数量 如果主分片数量太少&#xff0c;会导致每个分片中的数据量过大&#xff0c;而且无法利用集群中所有节点的计算资源。如果主分片数量太多&#xff0c;会导致索引过度…...

【JavaParser笔记01】JavaParser解析Java源代码中的类信息(javadoc注释、类​​​​​​​名称)

这篇文章,主要介绍如何使用JavaParser解析Java源代码中的类信息(javadoc注释、类名称)。 目录 一、JavaParser依赖库 1.1、引入依赖 1.2、获取类注释信息...

Stable Diffusion扩散模型【详解】小白也能看懂!!

文章目录 1、Diffusion的整体过程2、加噪过程2.1 加噪的具体细节2.2 加噪过程的公式推导 3、去噪过程3.1 图像概率分布 4、损失函数5、 伪代码过程 此文涉及公式推导&#xff0c;需要参考这篇文章&#xff1a; Stable Diffusion扩散模型推导公式的基础知识 1、Diffusion的整体…...

关于rabbitmq的prefetch机制

消息预取机制&#xff08;Prefetch Mechanism&#xff09;是RabbitMQ中用于控制消息传递给消费者的一种机制。它定义了在一个信道上&#xff0c;消费者允许的最大未确认的消息数量。一旦未确认的消息数量达到了设置的预取值&#xff0c;RabbitMQ就会停止向该消费者发送更多消息…...

机器学习介绍

机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;它使计算机系统能够从数据中学习并改进它们的性能。机器学习的核心在于开发算法&#xff0c;这些算法可以从大量数据中识别模式和特征&#xff0c;并用这些信息来做出预测或决策&#xff0c;而无需进行明确…...

OpenCV4.9开发之Window开发环境搭建

1.打开OpenCV所在github地址 2.点击opencv仓库,进入仓库详情,点击右下方的OpenCV 4.9.0进入下载页面 3.点击opencv-4.9.0-windows.exe下载 开始下载中... 下载完成 下载完成后,双击运行解压,默认解压路径,修改为c:/...

DDD 中的实体和值对象有什么区别?

在DDD中&#xff0c;实体 Entity 和值对象 Value Object 是两个基本的概念&#xff0c;它们之间有一些重要的区别。 唯一性&#xff1a;实体是唯一的&#xff0c;每个实体都有一个唯一的标识符&#xff0c;即使它的属性在一段时间内发生了变化&#xff0c;它仍然是这个实体。与…...

算法-最值问题

#include<iostream> using namespace std; int main() {int a[7];//上午上课时间int b[7];//下午上课时间int c[7];//一天总上课时间for (int i 0; i < 7; i) {cin >> a[i] >> b[i];c[i] a[i] b[i];}int max c[0];//max记录最长时间int index -1;//索…...

做电商网站一般需要什么流程图/互联网广告推广是做什么的

对于刚入门的PHP新手来说&#xff0c;可能对xdebug是什么都不太清楚。简单的说就是一个PHP程序错误调试工具。那有的新手朋友可能会问这个xdebug有什么用呢&#xff1f;xdebug工具可以用来分析跟踪程序的运行情况。xdebug工具能帮助PHP人员更高效更方便快捷地进行程序开发工作&…...

怎样用mysql做网站/网络整合营销方案

抽象类前面我们讲通过继承&#xff0c;多态的方式&#xff0c;构建出扩展性良好的java程序&#xff0c;但是还不够。因为它们不能够进一步约束程序员编写程序的方式&#xff0c;而抽象类就能通过某种方式让使用它的程序员们按照某种约束进行编码。抽象类是什么&#xff1f;定义…...

如何优化网站内容/营销平台有哪些

浪花是如何形成的&#xff1f;如果把浪花拆解开来&#xff0c;它只剩下一个个水分子。如果再把这些水分子聚集起来&#xff0c;在潮汐力的作用下&#xff0c;浪花才能“涌现”出来。涌现&#xff0c;也是智慧诞生的方式。由简单的元素和简单的联接&#xff0c;构成一个足够复杂…...

自己做网站需要啥/曲靖新闻今日头条

保存个链接&#xff0c;免得以后用的时候找不到 下载地址...

宝塔 wordpress/seo网络优化

前言 继续学习sqli-labs 本篇是less 23-24 Less-23 GET - Error based - strip comments (基于错误的&#xff0c;过滤注释的GET型) 测试 ?id1然后尝试#、--等注释 都无用 看了眼源码 注释都被替换掉了 尝试闭合 ?id-1 union select 1, 2, 3 ?id-1 union select 1, dat…...

网站免备案空间/网络seo营销推广

1.Path注解 Path 注解可以标记在类名之上&#xff0c;也可以标记在方法名上。该注解接收一个value参数&#xff0c;表示定义资源的地址。 另外&#xff0c;资源地址相同&#xff0c;但是HTTP方法不同的两个方法是完全两个不同的REST接口&#xff0c;HTTP方法和资源地址相结合…...