ObjectiveC-10-OOP面向对象程序设计-分类/类别

类别(Category)是OjectiveC的一个特性,主要目的是让开发者可以以模块的形式向类添加方法(扩展),创建标准化的方法列表供给其他人实现。

有些文档也会翻译成类别,其实是一个意思。

概述

语法说明

类别提供了一个简单的方式,将类定义模块化到相关组或分类中,同时也提供了扩展现有类定义的简便方式。换句话说,它的功能有些类似于接口继承,但又比继承简单和强大,在使用时需要结合继承一起使用,其能力是非常厉害的。 分类的语法如下:

@interface Fraction(Category1) //类名+(类别名称)//分类方法的代码
@end
@interface Fraction(Category2)//分类方法的代码
@end

类别的作用

如果在xcode中使用新建文件功能创建Cocoa class文件,会自动生成.h和.m文件。在这种分离的设计基础上附加分类后,可以使用分类实现下面三个方面的能力增强:

  1. 扩展现有类库的功能:比如扩展NSString、NSObject类,这种方式某些书中扩展NSObject类有时被称为非正式协议;
  2. 扩展现有类的声明:定义一个声明,然后分模块实现,比如在一个.h文件中定义类声明,然后分多个.m实现,一个.m实现其中一个分类,这样方便分工合作;
  3. 为现在的自定义类添加私有方法而不必重新定义子类;

类别规则

  1. 类别文件名称一般是是“类名称+类别名称”来命名,这是一个不成文的规定;
  2. 类别中可以添加属性,但不能添加实例变量,而且属性必须是@dynamic类型的;
  3. 如果类别方法与现有类的方法重名,类的方法会被覆盖掉,一旦覆写后外部就不能访问原来的方法了,所以这块要特殊设计一下;
  4. 如果多个分类中有同名的方法,可能会引起混乱;分类后不仅会影响当前类,也会影响所有的子类;
  5. 类别的名称是在类的范围内是唯一的;

创建类别

在新建文件中,选择Objective-C文件类型
在这里插入图片描述
在配置界面做如下配置,注意File Type选择 Category:
在这里插入图片描述
最后生成如下项目工程文件如下:
在这里插入图片描述

类别能力

给现有类添加新方法

类别可以为所有类添加新方法,包括系统类库和自定义的类。下面的代码就用一个自定义的类别来扩展系统提供的NSString类库的功能。

  • 类别定义
//扩展系统NSString,添加一个名为NumberConvenience的类别
#import <Foundation/Foundation.h>@interface NSString (NumberConvenience)- (NSNumber *)lengthAsNumber; //添加一个新方法@end
  • 类别实现
#import "NSString+NumberConvenience.h"@implementation NSString (NumberConvenience)- (NSNumber *)lengthAsNumber{NSUInteger length = [self length];return ([NSNumber numberWithUnsignedInt:length]);
} // lengthAsNumber@end
  • 类别测试
#import <Foundation/Foundation.h>
#import "NSString+NumberConvenience.h"int main(int argc, const char * argv[]){@autoreleasepool{NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:[@"hello" lengthAsNumber] forKey:@"hello"];NSLog (@"%@", dict);}return 0;
}

类能力(声明)的动态扩展

有别于上面的给现有类添加新方法的实现,类功能的动态扩展不需要新建文件,也可以实现定义实例变量。

方法是创建一个未命名的分类,然后在()中不指定任何名字,在这个类中可以扩展实例变量和属性(在有命名的分类中是不允许的)。未命名分类中的方法需要在主实现区中实现,而不是在分离的实现区中实现。

在未命名类别中的扩展的属性必须是私有的

  • 自定义类,Fraction是一个自定义的类,用于此示例的测试
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN//原始接口声明
@interface Fraction : NSObject@property (assign) NSInteger thing1;
//标记为只读属性
@property (readonly, assign) NSInteger thing2;- (void)resetAllValues;@end
  • 扩展自定义类的属性和方法
@interface Fraction() //空
NS_ASSUME_NONNULL_END
{NSInteger thing4; //添加了新实例变量
}
@property (readwrite, assign) NSInteger thing2; //覆盖了原有属性
@property (assign) NSInteger thing3; //添加了新私有属性
@end
  • 实现自定义类
#import "Fraction.h"@implementation Fraction- (void)resetAllValues
{self.thing1 = 200;self.thing2 = 300;self.thing3 = 400;thing4 = 5;
}- (NSString *) description
{NSString *desc = [NSString stringWithFormat: @"%d %d %d %d", _thing1, _thing2, _thing3, thing4];return (desc);} // description@end
  • 测试代码
#import <Foundation/Foundation.h>
#import "NSString+NumberConvenience.h"
#import "Fraction.h"int main(int argc, const char * argv[]) {@autoreleasepool {NSMutableDictionary *dict = [NSMutableDictionary dictionary];[dict setObject:[@"hello" lengthAsNumber] forKey:@"hello"];NSLog (@"%@", dict);Fraction *things = [[Fraction alloc] init];things.thing1 = 1;NSLog(@"%@", things); //~1 0 0 0//重新赋值[things resetAllValues];NSLog(@"%@", things); //~200 300 400 5}return 0;
}

类分文件实现

前面所有的代码实现全是一个.h,一个m。如果是大型项目的话.m中的代码量可能非常区大,这里可以采用两种不同的设计方案解决:拆类或是分类。除了代码整洁外,还可以多人协作以及实现代码分包存储等功能,打破了继承这种约束。
在这里插入图片描述

即定义一个.h,多个.m实现这样的模式来分散类的实现,每个.m实现一个类别接口,示例代码如下:

类别定义

在这里插入图片描述

//类别定义
#import <Foundation/Foundation.h>@interface CategoryThing : NSObject
{NSInteger thing1;NSInteger thing2;NSInteger thing3;
}
@end // CategoryThing// Category thing1
@interface CategoryThing (Thing1)
- (void)setThing1:(NSInteger)thing1;
- (NSInteger)thing1;
@end// Category thing2
@interface CategoryThing(Thing2)
- (void)setThing2:(NSInteger)thing2;
- (NSInteger)thing2;
@end // CategoryThing (Thing2)// Category thing3
@interface CategoryThing (Thing3)
- (void)setThing3:(NSInteger)thing3;
- (NSInteger)thing3;
@end // CategoryThing (Thing3)

类别实现

在这里插入图片描述

#import "CategoryThing.h"@implementation CategoryThing (Thing1)
- (void)setThing1:(NSInteger)t1{thing1 = t1;
}- (NSInteger) thing1{return (thing1);
}@end // CategoryThing
#import "CategoryThing.h"@implementation CategoryThing (Thing2)- (void)setThing2:(NSInteger) t2{thing2 = t2;
}- (NSInteger)thing2{return (thing2);
}@end 
\#import "CategoryThing.h"@implementation CategoryThing (Thing3)- (void)setThing3:(NSInteger) t3{thing3 = t3;
}- (NSInteger)thing3{return (thing3);
}@end 

程序测试

main测试

#import <Foundation/Foundation.h>
#import "CategoryThing.h"int main(int argc, const char * argv[])
{@autoreleasepool{CategoryThing *thing = [[CategoryThing alloc] init];[thing setThing1: 5];[thing setThing2: 23];[thing setThing3: 42];NSLog (@"Things are %@", thing); //Things are 5 23 42}return 0;
}

end…

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机倾斜摄影技术在智慧城市中的应用

随着智慧城市的不断发展和完善&#xff0c;新兴热门技术也不断崛起。无人机技术作为其中之一&#xff0c;具有操作简单、应用灵活等优势&#xff0c;受到了各个行业的青睐。现阶段&#xff0c;无人机技术与5G移动通信系统、人工智能系统深度融合&#xff0c;实现了无人机技术的…

基于微信小程序的实验室预约系统的设计与开发

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

C++第十五弹---string基本介绍(一)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、什么是STL 2、STL的版本 3、STL的六大组件 4、STL的重要性 5、如何学习STL 6、STL的缺陷 7、为什么学习string类 7.1、C语言中的字符串…

(python)空值处理

前言 空值&#xff08;缺失值&#xff09;在数据中出现的背景通常是数据采集、存储、处理或转换过程中的各种情况和因素. 场景 空值在数据中出现的背景是多种多样的. 数据采集和输入&#xff1a;在数据采集阶段&#xff0c;可能由于人为错误、设备故障、传感器故障或信号丢失等…

上传应用程序到苹果应用商店的工具和要点

引言 在今天的移动应用市场中&#xff0c;将应用程序上传到苹果应用商店&#xff08;App Store&#xff09;是许多开发者的首要任务之一。然而&#xff0c;不同操作系统下的开发者可能需要使用不同的工具和遵循不同的要求来完成这一任务。本文将介绍在 macOS、Windows 和 Linu…

可编程网关:如何助力智慧工厂实现智能化管理

一个具体的实际案例&#xff0c;详细说明可编程网关在某汽车零部件智慧工厂中的应用细节&#xff1a; 案例背景&#xff1a; 某大型汽车零部件制造企业&#xff0c;致力于提升生产效率、降低运营成本、确保产品质量&#xff0c;决定对其传统工厂进行全面数字化改造&#xff0…

[C语言]——动态内存管理

目录 一.为什么要有动态内存分配 二.malloc和free 1.malloc 2.free 三.calloc和realloc 1.calloc 2.realloc 3.空间的释放​编辑 四.常见的动态内存的错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用free释放⼀块…

SpringBoot自动装配原理之@Import注解解析

文章目录 1. 概述2. 使用2.1 导入普通Bean2.2 导入配置类2.3 导入 ImportSelector 实现类2.4 导入 ImportBeanDefinitionRegistrar 实现类 3. 区别 1. 概述 当谈及现代Java开发领域中的框架选择时&#xff0c;SpringBoot无疑是无与伦比的热门之选。其简化了开发流程&#xff0…

深澜计费管理系统 任意文件读取漏洞复现

0x01 产品简介 深澜计费管理系统是是一套完善的领先的具有复杂生物型特征的弹性认证计费系统。系统主要由 AAA 认证计费平台、系统运营维护管理平台、用户及策略管理平台、用户自助服务平台、智能客户端模块、消息推送模块、数据统计模块组成。目前在全球为超过 2500 家客户提…

Github上传大文件(>25MB)教程

0.在github中创建新的项目&#xff08;已创建可忽略这一步&#xff09; 如上图所示&#xff0c;点击New repository 进入如下页面&#xff1a; 1.下载Git LFS 下载git 2.打开gitbash 3.上传文件&#xff0c;代码如下: cd upload #进入名为upload的文件夹&#xff0c;提前…

Vue3跟Vue2比,性能真的有所提升吗?

答案是肯定的。 说起Vue3的改进&#xff0c;很多人都会说出响应式的改变&#xff0c;与Vue2相比&#xff0c;Vue3采用了proxy的方式对响应式做了重写&#xff0c;而Vue2则是采用defineProperty的方式将对象的属性进行深度遍历&#xff0c;而这种方式想要实现响应式的前与后&am…

【C语言】扫雷【附源码】

一、扫雷游戏规则 尽快找到雷区中的所有不是地雷的格子,而不许踩到地雷。点开的数字是几&#xff0c;则说明该数字旁边的8个位置中有几个雷&#xff0c;如果挖开的是地雷&#xff0c;则会输掉游戏。 二、代码思路&#xff1a; 宏定义&#xff1a; Row 和 Col 定义了棋盘的行数和…

VR在线招聘会在企业与毕业生间搭建沟通新平台

在数字化转型的浪潮中&#xff0c;VR在线招聘会作为一种创新的招聘方式&#xff0c;正逐步成为连接企业、学校和毕业生的重要桥梁。 一、VR在线招聘会的实际意义及其优势 VR技术的应用&#xff0c;让在线招聘会超越了传统线上招聘的局限&#xff0c;提供了更为生动、互动的招聘…

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

京东详情API接口请求代码源码(java)

京东详情API接口是用于获取京东商品详细信息的接口&#xff0c;它允许开发者通过发送请求&#xff0c;获取商品的描述、价格、评价等信息。下面是一个关于京东详情API接口的示例文档&#xff0c;包括接口地址、请求参数、响应参数等内容。 京东详情API接口文档 接口地址&#x…

机器学习知识点

1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题&#xff0c;旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征&#xff0c;将鸢尾花分成三个品种&#xff1a;山鸢尾&#xff08;setosa&#xff09;、变色鸢尾&#xff08;versicolor&#xff09;和维吉尼亚…

使用 Go-Ora 连接到 Oracle 数据库

前文 《 一鍵啓動 Oracle 23c Free 》 介绍了如何使用容器技术快速拉起 Oracle 23c 数据库。 这个开发者版本可以很便捷的拉起、测试、销毁&#xff0c;对开发者是非常友好的。 本文将介绍如何使用 Go 语言构建项目&#xff0c;并连接到 Oracle 数据库。 Go 环境配置 本文使用的…

【数据结构与算法】:归并排序和计数排序

1. 归并排序 归并排序是一种效率仅次于快速排序的排序算法。它有非递归和递归两种实现方式(本文只讲述递归实现&#xff0c;非递归实现以后有专门的文章)。 其实&#xff0c;归并排序也叫外排序。它不仅可以对内存中的数据进行排序&#xff0c;还能对文件里的数据排序。 比如&…

LeetCode 使数组连续的最少操作数

地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;困难 题目描述&#xff1a;给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元素替换成 **任意 **整数。 如果 nums 满足以下条件&#xff0c;那么它是 连续的 &#x…

点击上传文件

一、页面样式&#xff1a; &#xff08;1&#xff09;点击前&#xff1a; &#xff08;2&#xff09;点击后&#xff1a; 设计&#xff1a;①自定义elementPlus图标&#xff1b;②使用Tooltip实现鼠标悬浮按钮上出现文字提示&#xff1b;③上传与更换的切换样式&#xff1b;…