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

news2024/10/11 10:17:12

本节用一简短的文章来说下是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; //引擎名称
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1567745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java,SSM,html,Vue在线视频播放管理系统网站设计

摘要 基于Java, SSM, HTML, Vue的在线视频播放管理系统网站设计是一个利用Spring框架、SpringMVC、MyBatis&#xff08;SSM&#xff09;和前端技术HTML与Vue.js实现的多功能Web应用。这个系统旨在为用户提供一个便捷、高效的平台来上传、管理和观看视频内容&#xff0c;同时兼…

Spring与SpringBoot的区别

Spring是一个开源的Java应用程序框架&#xff0c;旨在简化企业级Java应用程序的开发。它提供了一个轻量级的容器&#xff0c;用于管理应用程序中的各个组件&#xff08;如依赖注入、AOP等&#xff09;&#xff0c;并提供了丰富的功能和模块&#xff0c;用于处理数据库访问、事务…

enqueue:oracle锁机制

实现锁的方式就是排队咯&#xff0c;那么排队就是有enqueue这么个结构来管理 管理锁的结构叫队列&#xff0c;即enqueue 所有和enqueue相关的函数都叫KSQ-- kernal service enqueue lock是从应用层面看到的锁&#xff0c;enqueue是oracle内部管理锁的一个结构。 可以用v$lock_…

ajax教程

文章目录 一、原生ajax1、AJAX 简介2、特点1&#xff09;优点2&#xff09;缺点 二、http协议1、概念2、Cookie和Session机制1&#xff09;Cookie2&#xff09;Session3&#xff09;报文 二、请求头1、概念2、常见请求头&#xff1a;3、Content-Type 三、AJAX使用1、详细操作2、…

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

显示器and拓展坞PD底层协商

简介&#xff1a; PD显示器或者PD拓展坞方案中&#xff0c;连接显示设备的Type-C端口主要运行在DRP模式&#xff0c;在此模式下可以兼容Source&#xff08;显卡&#xff09;、Sink&#xff08;信号器&#xff09;、DRP&#xff08;手机、电脑&#xff09;模式的显示设备。 Sou…

维基百科:8个提升维基百科推广效果的优化技巧-华媒舍

维基百科是全球最大的在线百科全书&#xff0c;致力于向用户提供高质量、可靠的知识内容。想要让自己的文章在维基百科中获得更多的曝光度和推广效果&#xff0c;并非易事。为此&#xff0c;我们整理了以下8个提升维基百科推广效果的优化技巧。 1. 确保内容符合要求 维基百科对…

Quiet-STaR:让语言模型在“说话”前思考

大型语言模型(llm)已经变得越来越复杂&#xff0c;能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题&#xff0c;与人类不同LLM经常在推理中涉及的隐含步骤中挣扎&#xff0c;这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…

windows下安装iteliij Idea2023.3

首先从官网下载 下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 双击打开进行安装&#xff1a; 安装完成后&#xff0c;需要对Idea进行稍微处理下。使用我分享给大家的文件&#xff0c;操作以下步骤&#xff1a; 注意&#xff1a;不能打开IDEA软件。 进入到scripts中点击un…

Spring Cloud微服务入门(一)

微服务的演变过程 //controller 视图交互层 前端数据处理传给service //1.DAO RequestBody userDAO String id;String type; {"id":"lcs", "type":"lcs"} //2.GET请求 findUserById&#xff1f;id1&typelcsRequestParam String …

css3之3D转换transform

css3之3D转换 一.特点二.坐标系三.3D移动&#xff08;translate3d)1.概念2.透视&#xff08;perpective)(近大远小&#xff09;&#xff08;写在父盒子上&#xff09; 四.3D旋转&#xff08;rotate3d)1.概念2.左手准则3.呈现&#xff08;transfrom-style)&#xff08;写父级盒子…

Python脚本:给TXT文件中的地铁站名添加引号

Python脚本&#xff1a;给TXT文件中的地铁站名添加引号 在日常的数据处理工作中&#xff0c;我们经常需要对文本数据进行格式化和处理。今天&#xff0c;我们就来分享一个使用Python脚本对TXT文件中的地铁站名进行处理的小技巧&#xff1a;将每行的地铁站名字加上双引号。 需求…

创新指南|贝恩的产品经理RAPID框架:解决问题的分步指南,使决策过程既高效又民主

您是否曾发现自己陷入项目的阵痛之中&#xff0c;决策混乱、角色不明确、团队成员之间的冲突不断升级&#xff1f;作为产品经理&#xff0c;驾驭这艘船穿过如此汹涌的水域可能是令人畏惧的。应对这些挑战的关键在于采用清晰、结构化的决策方法。输入贝恩的 RAPID 框架&#xff…

基于8B10B的GT收发器PHY层设计(3)PHY层设计

文章目录 前言一、设计框图二、PHY层基本传输协议三、PHY_TX模块3.1、模块接口3.2、组帧状态机描述3.3、数据大小端问题3.4、字节对齐 四、PHY_RX模块4.1、模块接口4.2、大小端转换4.3、起始位4.4、结束位4.5、axis数据流恢复 五、LFSR伪随机码六、链路空闲时期处理 前言 上一…

宁盾入选“2023年度中国高科技高成长企业榜”多个榜单

4月1日&#xff0c;由【第一新声】联合【天眼查】启动“数字未来”系列之 2023 年度中国高科技高成长企业系列榜单正式发布。宁盾入选未来独角兽企业、网络安全领域高成长企业、信创产业最佳服务商、企业数字化标杆案例 4 个榜单。 该榜单旨在发现和挖掘被资本市场关注&#xf…

基于顺序表 --- 实现简易【通讯录】

1. 多文件操作 SeqList.h //用于定义顺序表的结构&#xff0c;增删查改等函数的声明 SeqList.c //用于实现增删查改等函数 Contact.h //用于定义通讯录的结构&#xff0c;通讯录中联系人的增删查改等函数的声明 Contact.c //用于实现通讯录中增删查改等函数 Test.h //用于测试…

重磅!openGauss6.0创新版本,带着新特性正式发布了!

&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; 中国DBA联盟(ACD…

最新社交相亲系统源码PHP

最新社交相亲系统源码PHP 安装环境&#xff1a; php7.2 mysql 5.7 框架&#xff1a; 后端thinkphp6 前端&#xff1a;jquery layui PC 移动端响应式 线上案例&#xff1a;https://cjr.oemsun.com/ 主要页面及功能预览 首页 相亲资料详情页 红娘跟进记录 海报、一键复制分…

实操:Dropzone.js实现文件上传

&#x1f3e0;官网 点我前往 &#x1f953;依赖 <script src"https://unpkg.com/dropzone5/dist/min/dropzone.min.js"></script> <link rel"stylesheet" href"https://unpkg.com/dropzone5/dist/min/dropzone.min.css" type&…

STL——vector容器基本使用与常用接口模拟实现

vector的介绍及使用 vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的…