第一章 类和对象(3)
类
典型的面向对象程序是有各种各样的对象组成的。基于Cocoa框架的程序应该会使用NSMatrix, NSWindow, NSDictionary, NSFont, NSText以及其他许多对象。程序还经常使用超过一个同类型或类的对象,比如NSArray 或 NSWindow 对象。 在Objective-C中,定义一个对象是靠定义类来实现的。类定义了一组对象的原型,它声明了实例变量作为类的一部分成员,同事定义了一组方法给类的对象使用。
编译器为每个类创建一个可访问对象,类对象知道如何创建一个属于这个类的新对象(基于这个原因典型的叫法是“对象工厂”)。类对象是类编译后的版本,对象是类的实例。你的程序中做主要工作的是在运行的时候类对象创建的那些实例化后的对象。
一个类的所有实例都有一组相同的方法和一组从相同模型中产生实例变量。每个对象有各自的实例变量,但是他们的方法是共享的。
通常约定类名的首字母大写(比如“Rectangle”),实例的名字首字母小写(比如“myRect”)。
继承
类的定义是可添加的,每一个你定义的新类是基于另一个类,继承了那个类的方法和成员变量。新类只需要简单的添加或修改它所继承的东西,而不需要完全复制那些代码。
一个基类在继承树的顶端将所有的类通过继承关系联系在一起。当基于这个框架写代码时,这个基类是NSObject。所有的类(除了基类)都有父类(离基类更近一步),同时所有的类都可以是任意数量子类(离基类更远一步)的父类。图 1-1 说明了一部分画图程序中的类。
图 1-1 画图程序类
这个图说明了Square类是Rectangle类的子类,Rectangle类是Shape的子类,Shape是Graphic的子类,Graphic是NSObject的子类。继承是累积的,所以Square对象有Rectangle, Shape, Graphic, 和NSObject对象中定义的方法和成员变量以及Square中自己定义的方法和成员变量。简单的说就是Square 对象不仅仅是一个Square对象,它也是一个Rectangle对象, 一个Shape对象, 一个Graphic对象, 一个NSObject对象。
因此除了NSObject之外每个类都是一个专业化的或者是另一个类的改编。每个类是它所继承的一连串父类改进的累积。Square类仅需少量定义就可从Rectangle转换到Square。
当你定义一个类时,通过声明其父类链接到该层次结构 ;你创建的每个类 (除非您定义一个新的根类),必须是另一个类的子类。许多已经存在的超类都可用。Cocoa包括 NSObject 类和几个框架包含额外的 250 多个类的定义。有些类你可以在你的程序中直接使用。其他的可能要通过定义子类来适应你自己的需求。
一些框架类定义几乎所有你需要的,仅一些具体细节需要你在子类中实现的。因此,通过重用框架的程序员所做的工作你只需要编写少量代码就可以创建非常复杂的对象。
NSObject类
NSObject 是一个根类,所以没有父类。它定义了Objective-C对象和对象的交互的基本框架。而且传授类和从其继承的类实例与运行时系统合作的能力。
NSObject类的子类不需要任何特别的行为,类的实例必须至少具有类似Objective-C对象在运行时的行为的能力。从 NSObject 类继承这种能力简单得多,比重塑新的类定义更为可靠。
注意:实施新的根类是微妙的任务具有许多隐藏的危险。该类必须重复很多 NSObject 类做的,如分配实例、将它们连接到它们的类并让运行时系统识别它们。为此,通常应该使用Cocoa提供的根类NSObject。有关详细信息,请参阅 NSObject 类和 NSObject 协议的基础框架文档。
继承实例变量
当一个类对象创建一个新实例时,新对象包含不只定义它的类的实例变量,但还定义为其父类和其父类的父类的实例变量,一直到根类。因此,在 NSObject 类中定义的 isa 实例变量将成为每个对象的一部分。isa 连接到它的类的每个对象。
图 1-2 显示实例变量,可以被定义为特定的实现的矩形,和他们可能从哪里来的。请注意一个矩形对象的变量添加到Shape对象,Shape对象添加到图形对象,等等。
图 1-2 Rectangle实例变量
一个类可以没有实例变量的声明。如果它不需要的任何实例变量,可以只是依靠它所继承的的实例变量定义新的方法。例如,矩形可能不声明任何它自己的新的实例变量。 更多详细内容 »
Tags: Apple, iPhone, Mac, Objective-C
近期评论