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

iOS开发-类簇(Class Cluster)

类簇(Class  Cluster)是定义相同的接口并提供相同功能的一组类的集合,仅公开接口的抽象类也可以称之为类簇的公共类,每个具体类的接口有公共类的接口抽象化,并隐藏在簇的内部。这些类一般不能够直接使用,一般都是由公共类的子类来实现,可以称之为私有子类。看概念会觉得有点枯燥,其实最常用的NSString就是一个类簇,不过看起来不明显,比较明显的是NSNumber,numberWithInt,numberWithDouble,这些方法其实在调用NSNumber的时候父类实例化私有子类,返回对应的实例。

基础概念

概念一般都是比较枯燥一点,我们可以先写一个简单的测试小程序来看一下NSString类簇大概的样子:

        NSString  *result=@"博客园-FlyElephant";
        classClusterLog(result);
        classClusterLog([result stringByAppendingString:@"原文地址:http://www.cnblogs.com/xiaofeixiang/"]);
        classClusterLog([NSString stringWithUTF8String:"---"]);
        classClusterLog(NSHomeDirectory());

 输出方法:

static  void  classClusterLog(NSString  *str){
    NSLog(@"Content=%@,Class=%s,\tmember=%s,\tkind=%s\n",
          str,
          [NSStringFromClass([str class]) UTF8String],
    [str isMemberOfClass:[NSString class]]?"Yes":"NO",
     [str isKindOfClass:[NSString class]]?"YES":"NO");
}

测试结果:

通过Log我们输出了类的真实的类型,我们发现每个类的类型都不一样,而且我们MemberClass得到的是类簇的类型,KindClass才能得到子类的类型,很多情况下公共类作为抽象类被实现的时候,各个方法都是在子类中具体实现的,因此即使直接生成继承公共类的子类,也不能立即产生用户想要的功能。

类簇的子类

类簇是多种类别实现抽象化,在公共类的外部只有类簇是可见的,虽然类簇是作为Foundation框架的基本类实现,一般情况下没必要生成子类,不过有的时候类簇的基本方法方法不能满足基本需求的时候可以使用Category进行扩展,这个之前的文章中有过讲述,如果不是很清晰,可以查看一下。类簇包含了基本的方法,但是具体的实现都是在私有子类中。如果我们需要新生成子类,可以直接实现已经公开的基本方法。

NSString有两个基本的方法:length和characterAtIndex,我们定义个NSString子类看一下效果:

@interface BitPattern : NSString
{
    unsigned  char  value;
}

-(id)initWithChar:(char)val;

-(NSUInteger)length;

-(unichar)characterAtIndex:(NSUInteger)index;

@end

实现文件:

@implementation BitPattern

-(id)initWithChar:(char)val{
    self=[super init];
    if (self) {
        value=val;
    }
    return self;
}

-(NSUInteger)length{
    return 4;
}

-(unichar)characterAtIndex:(NSUInteger)index{
    return 'K';
}

@end

简单调用:

        NSString  *bits;
        bits=[[BitPattern alloc]initWithChar:'A'];
        NSLog(@"%@--结果为:%s",[bits class],[bits UTF8String]);

最后的结果为KKKK,关于类簇的子类的实现方法有几个需要考虑的地方:

1.确定私有数据结构,作为超类不能使用所有的数据结构;  

2.定义初始化方法,定义init..这样的初始化方法,不能继承和使用init之外的超类的初始化方法;

3.定义构造器,不能继承和使用超类的同样的方法;

4.定义基本方法

5.定义其他方法,通过定义基础方法,公共类声明的方法可以暂且执行,但是利益哦那个生成的数据结构的特征也许能够产生更加高效的方法;

iOS中的类簇也可以理解为简单工厂设计模式的一种具体实现~

转载于:https://www.cnblogs.com/xiaofeixiang/p/4712282.html

相关文章:

  • HDU-1350 Taxi Cab Scheme(最小路径覆盖)
  • codeforces-884D Boxes And Balls(思维、三叉哈夫曼树)
  • 设置c++程序的堆栈空间解决栈溢出问题
  • POJ-1932 XYZZY(判正权环路+Warlshell传递闭包)
  • Codeforces 827C DNA Evolution(多维树状数组)
  • larbin是一种开源的网络爬虫/网络蜘
  • Codeforces 855E Salazar Slytherin's Locket(数位dp)
  • JAVA爬虫 WebCollector
  • HDU-6215 Brute Force Sorting(思维、模拟链表)
  • HDU-1719 Friend(公式化简)
  • js如何获取微信版本号
  • HDU-4664 Triangulation(博弈SG打表+类似凸包性质)
  • asp。net5的依赖注入
  • 卡特兰数的初步学习
  • HDU-3723 Delta Wave(卡特兰数+大数递推)
  • [笔记] php常见简单功能及函数
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • AHK 中 = 和 == 等比较运算符的用法
  • Android系统模拟器绘制实现概述
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • React的组件模式
  • SpiderData 2019年2月16日 DApp数据排行榜
  • spring boot 整合mybatis 无法输出sql的问题
  • tweak 支持第三方库
  • 程序员最讨厌的9句话,你可有补充?
  • 动态规划入门(以爬楼梯为例)
  • 高度不固定时垂直居中
  • 如何设计一个比特币钱包服务
  • 深度解析利用ES6进行Promise封装总结
  • 使用 QuickBI 搭建酷炫可视化分析
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 原生 js 实现移动端 Touch 滑动反弹
  • 数据可视化之下发图实践
  • ​TypeScript都不会用,也敢说会前端?
  • #14vue3生成表单并跳转到外部地址的方式
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #include
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (编译到47%失败)to be deleted
  • (二)hibernate配置管理
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • **PHP二维数组遍历时同时赋值
  • .net 使用ajax控件后如何调用前端脚本
  • .net2005怎么读string形的xml,不是xml文件。
  • .Net多线程总结
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /var/spool/postfix/maildrop 下有大量文件
  • @RequestBody与@ModelAttribute
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [C++]C++入门--引用