第十一章 抽象类

什么是抽象类

抽象类自身不生成实例,它是为了给所有继承它的子类提供统一的接口而定义的。

在超类中,只描述接口和公共部分的定义。这样在定义子类时,在子类中只声明那些需要具体定义的方法,这样的超类就是抽象类或者称为虚类。

类簇

类簇的概念

类簇(class cluster)就是定义相同的接口并提供相同功能的一组类的集合。仅公开接口的抽象类也称为类簇的公共类(public class)。各个具体类的接口由公共类的接口抽象化,并被隐藏在簇的内部。这些具体类不能被直接使用,一般会作为公共类的子类来实现,所以有时也称他们为私有子类。

实际编写代码时,公共类和普通类按照同样的方式使用,但是实际上被生成并存在在内存上的实例是隐藏在类簇中的某个类的实例。因为可以正确执行,所以程序几乎意识不到这点差异。类簇有一个机制,可以从多个已存在的类中挑选出最适合当前场景的类并且自动启用。

ps:百度百科:

类簇 是一群隐藏在通用接口下的与实现相关的类,使得我们编写的代码可以独立于底层实现(因为接口是稳定的)。如创建NSString对象时,你得到的可能是NSLiteralString,NSCFString,NSSimpleCString等。即不同的NSString对象调用同一个接口A,接口A的实现可能是不同的

编程中的注意事项

OC中没有专门构成类簇的语法。一般情况下,公共类默认为抽象类,而具体的类则是作为公共类的私有子类来实现。使用类簇时,不用在意和普通类的差别,但要注意以下两点:

1.查看实例所属的类时

对于类簇来说,所有的实例都是私有子类的实例,因此,从类簇的测试程序中我们可以看出,方法isMemberOfClass:即使是将公共类作为输入参数,也很难知道结果。

当实例所属类的处理策略被改变时,可以使用方法isKindOClass:判断是否为子类实例,使用方法respondsToSelector:判断是否为特定方法,这些方法都十分有效。

2.生成子类时

很多情况下,公共类作为抽象类被实现的时候,各个方法是在私有子类中具体实现的。因此,即便生成了直接继承公共类的子类,也不能立即产生用户想要的功能。

生成类簇的子类

类簇使多种类别实现抽象化,在公共类的外部只有类簇是可见的。下面说明一下如何产生基于扩展或改变类簇功能的类。因为类簇目前是作为Foundation框架的基本类来实现的,所以一般情况下,没有必要生成子类。

使用范畴

添加新的范畴可以扩展公共类的功能,也可以实现实例变量那样使用关联引用的功能。

在公共类添加的范畴也会被类簇中隐藏的子类所继承,所以类簇中所有的类都可以使用新添加的功能。

基本方法的重定义

类簇包含一小部分基本方法,其他方法都是在基本方法的基础上实现的。基本方法在子类中实现,而其他方法在公共类中实现。每个子类(私有类)中不同的实现细节都隐藏在基本方法中。也就是说,即使在类簇内部,也实现了过程抽象化和信息隐藏。

因此,定义私有数据结构及对其访问的基本方法是为了类簇生成新的子类的最好方式。

下面具体说明类簇的子类的实现方法:

1.确定私有数据结构

确定作为实例变量的数据结构,作为超类的类簇不能使用所有的数据结构。

2.定义初始化方法

定义init...这样的初始化方法。不能继承和使用init之外的超类的初始化方法。只要没有私有数据结构,就可以使用init,所以没必要定义初始化方法。

3.定义便利构造器

必要的话,以数据类型名作为前缀,定义生成临时对象的类方法。不能继承及使用超类的同样的方法。

4.定义基本方法

定义自己的基本方法。

5.定义其他方法

通过定义基本方法,公共类声明的方法可以暂且执行,但是利用生成数据结构的特征也许能够产生更加高效的方法,而且也可以重写这样的方法。如果已经在子类上单独扩展了功能,那么只要定义相应的方法就可以。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,556评论 18 399
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,887评论 1 15
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,627评论 0 11
  • 窗外冬阳寒,窗里独自闲。 读书未有意,倚榻悄成眠。 书开继何页,李杜漫游间。 相逢及梁宋,离别惺惺然。 挥毫文章就...
    马举生阅读 408评论 1 6