Skip to content

objective-c 翻译之一 #4

@varfunction

Description

@varfunction

一、类的定义 原文地址

类的定义

当你开发OS X或者iOS应用时,你大部分的时间将花费在处理对象。在obj-c中,对象这个概念和其他面向对象语言很相似:对象封装了数据和相关的行为。

一个app本质上就是由很多具有相互联系的对象组成的生态系统,它们一起协同处理特定的问题,比如显示一个虚拟的界面、对用户的输入作出响应,或者存储一些信息。在OS X和ios开发中,解决问题时,其实并不需要东拼西凑的去创建各种对象,只需要掌握库的使用就会事半功倍。(Cocoa库和Cocoa Touch库,分别面向OS X和ios开发)

这些对象中,有一部分可以即插即用,比如基本的数据类型string和numbers,或者是用户界面元素:按钮、表格。你可以按你所需把它们组装在一起,构建你自己的app。

在面向对象系统中,一个对象也叫做一个类的实例。这个章节将会向你介绍,在obj-c中如何定义一个类,通过类的定义,你会指定一系列的规则,并且会由一份代码去实现你指定的规则。

类是对象的蓝图

一个类描述了它实例对象的属性和行为。比如对于一个字符串对象(它是NSString类的实例),它的类声明了很多方法去处理它所表示的字符。同样,数值也是一样。

正如同很多建筑物都出自同一个建筑结构图一样,一个类所有的对象实例,它们的行为都是相同的。比如每一个NSString的实例,无论它存储了什么内容的字符,它们的行为都是一致的。

在具体的场景中,你只需要使用你指定的对象即可,你不必去关心这些对象内部是怎么实现的。你完全没必要去弄清楚一个字符串是怎么存储在内存中,你只需要明白怎么使用这个对象,它会产生什么样符合你预期的输出,你只需弄清楚比如发送某个消息给字符串对象,让它转成大写字母后返回给你等等,如此而已。

在obj-c中,类的interface准确的定义了这个类的实例,换句话说,类的interface定义了这个类的实例对象怎么与其他对象进行通信交互。

可变性决定了被表示的值是否可以改变

有这样一些类,它定义出来的对象是不可变的。这句话的意思就是,这些对象的值必须在创建对象时就完成指定,而不能在后续程序运行的时候修改它。在obj-c中,基础的NSString和NSNumber都是不可变的,如果你需要表示另一个数值,你必须使用一个新的NSNumber实例。

有些不可变的类同样提供了可变版本。如果你需要在运行时改变对象的值,比如向一个现有的字符串里追加字符,你可以使用NSMutableString类。这个类的实例对象和NSString对象很相似,它们的区别就在于,NSMutableString提供了动态修改值的功能。

在这里,尽管NSString和NSMutableString是两个不同的类,但他们有很多相同点。所以与其写两套完全不同的实现代码,不如使用继承的特性把他们连起来。

继承其他的类

在自然界里,我们通过门纲科等分类来划分不同的生物。

比如大猩猩,人类和猩猩,他们有很多相似之处,又属于不同的生物。但追根溯源,我们把他们都归为“人科”。具体可参见下图1-1.

GitHub Logo

在面向对象的世界里,对象也和自然界的生物一样,被按照相似的法则,做出了各自的划分。子类会拥有父类的特性,就好比大猩猩拥有“人科”的特性一样。

当一个类继承了其他的类,那么它就拥有了父类的全部行为和属性,同时它也有机会去指定它自己的额外的行为和属性,甚至去覆盖它父类的行为。

举例来说,obj-c中的字符串类,NSMutableString就是继承了NSString,参考图1-2,NSString类中的所有功能,在NSMutableString中都能找到,但NSMutableString提供了一些新的方法,让你可以对原有字符串进行追加,插入,替换或者删除。

GitHub Logo

根类提供基础功能

就像所有活着的生物都有“生命”这个特性,obj-c中的所有对象也是具有共同特性的。

当一个obj-c对象需要和其他对象协同工作时,它需要其他的对象提供出一些基础的特性和行为。基于这个原因,obj-c定义了一个根类NSObject,几乎所有的类都继承于此。

当你定义你自己的类时,你至少需要继承自NSObject。一般来说,你需要查找cocoa或者cocoa touch库,找到和你需求最接近的类,然后继承它。

举例来说,在ios app中,如果UIButton类没有提供足够的能力支持你的开发,你就需要自定义一个按钮类,让它继承UIButton。在这里如果你让它继承自NSObject类,那么你就悲剧了,你不得不把UIButton的所有实现都自己重做一遍,这是在浪费时间。

UIButton类继承自UIControl类,UIControl类描述了用户界面的基础控制行为。而UIControl类又继承于UIView类,UIView类提供了显示到界面的相关功能。UIView类继承于UIResponder类,UIResponder类提供了对于用户触摸、手势、摇晃的响应支持。最终,UIResponder继承了NSObject类。具体参考1-3。

GitHub Logo

这个继承链意味着,所有的子类可以获得所有父类的能力,包括爷爷类、祖先类的能力。

你在使用任何类时,记住他的继承链是很重要的,它能让你准确知道这个类能做什么。如果你寻找的东西不在这个类里,那么它很有可能在它的父类,或者更深的父类中定义了,你可以去那里试试看。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions