Objective-C(二,定义类)

类的定义

当你写软件,OS X或iOS,你的大部分时间都花在使用对象。在Objective-C对象,就像在其他面向对象编程语言的对象:他们与相关行为包数据。

一个应用程序被构建为一个大的生态系统,相互沟通,解决具体问题,如显示可视化界面,响应用户输入,或存储信息的相互连接的对象。对于OS X或iOS开发,你不需要从头开始创建解决每一个可以想象的问题的对象;相反,你有供您使用现有对象,由可可提供(对于OS X)和可可触摸(适用于iOS)的一个大型图书馆。

其中一些对象是立即可用,如基本数据类型,如字符串和数字,或如按钮和表视图用户界面元素。有些是专为你使用自己的代码定制您需要的方式行事。该应用程序的开发过程包括决定如何最好地定制和整合的基本框架,提供自己的对象,让您的应用其独特的特性和功能的对象。

在面向对象的编程而言,一个目的是一类的一个实例。本章将介绍如何通过声明一个接口,它描述了您打算使用的类及其实例的方式来定义的Objective-C类。该接口包括该类可以接收邮件的列表,所以你也需要提供类实现,其中包含针对每个消息要执行的代码。

类是对象蓝图

类描述常见于任何特定类型对象的行为和属性。对于字符串对象(在Objective-C,这是类的NSString的一个实例),这个类提供了各种方法来检查和转换,它代表内部字符。同样地,(NSNumber的)用于描述若干对象的类提供的功能周围的内部数值,如该值转换为不同的数值类型。

以同样的方式,从同一图纸构造多个建筑结构相同,类的每一个实例共享相同属性和行为作为该类别的所有其他实例。每NSString的实例的行为以相同的方式,无论其持有的字符的内部串的。

任何特定的对象被设计以特定的方式被使用。你可能知道,一个字符串对象表示的字符一些字符串,但你并不需要知道用来存放这些字符的确切的内部机制。你不知道的对象本身直接与它的字符来使用的内部行为什么,但你需要知道你预计如何与对象交互,也许要问它特定的字符或申请一个新的对象其中所有的原始字符转换为大写。

在Objective-C,类接口指定究竟如何对象的给定类型旨在被其他对象使用。换句话说,它定义了类的实例和外界之间的公共接口。

可变性确定是否代表值可以被更改

有些类定义是不可变对象。这意味着内部内容必须在创建对象时无法随后被其它对象来改变被设置,并且。在Objective-C,所有基本的NSString与NSNumber的对象是不可改变的。如果您需要代表不同的数字,你必须使用一个新的NSNumber实例。
一些一成不变的类还提供了一个可变版本。如果你特别需要通过他们通过网络连接接收追加字符更改字符串的内容在运行时,例如,可以使用的NSMutableString类的一个实例。这个类的实例表现就像NSString对象,但他们也提供的功能来改变对象表示的字符。虽然NSString的和的NSMutableString是不同的类,它们有许多相似之处。而不是从零开始,只是碰巧有一些类似的行为写两个完全独立的类,它是有道理的使用继承。

类继承了其它类

在自然界中,分类像种,属,家庭条件动物分类成组。这些基团是分层的,使得多个物种可能属于一个属,和多个属于一个家庭。

大猩猩,人类和猩猩,例如,有一些明显的相似性。虽然它们各自属于不同的种类,甚至不同属,部落,和亚家族,它们在分类学上,相关的,因为它们都属于同一家族(称为“人科”),如图1-1所示。

这里写图片描述

在面向对象编程的世界中,对象也分为分级组。而不是使用不同的术语对于不同层级,如属或种,对象只是组织成类。在人类继承某些特性作为人科家族的成员以同样的方式,一类可以被设置为从父类继承功能。

当一个类从另一个继承,孩子将继承父定义的所有行为和属性。它也有机会要么定义其自己的附加行为和属性,或重写父的行为。

在Objective-C字符串类的情况下,为的NSMutableString类描述指定类从继承NSString的,如图1-2所示。所有通过的NSString提供的功能是提供的NSMutableString,如查询特定的字符或申请新的大写字符串,但增加的NSMutableString允许您添加,插入,替换或删除子和单个字符的方法。

这里写图片描述

根类提供基本功能

在所有生物分享一些基本的“生活”的特点以同样的方式,一些功能是跨在Objective-C的所有对象普遍。

当一个Objective-C的对象需要与另一个类的实例来工作,它预期其他类提供某些基本特征和行为。出于这个原因,Objective-C中定义了一个根类从中绝大多数其他类的继承,称为NSObject的。当一个物体碰到另一个对象,它希望能够利用至少由NSObject类描述中定义的基本行为进行交互。

当你定义自己的类,你应该至少从NSObject的继承。一般情况下,你应该找到一个可可或可可触摸对象,提供最接近的功能,你需要什么,并从继承。

如果要定义使用的自定义按钮在iOS应用程序,例如,和所提供的UIButton类不提供足够的定制属性,以满足您的需求,它更有意义创建一个新的类继承自UIButton的不是从NSObject的。如果单纯从NSObject的继承,你需要复制所有的复杂的视觉交互和沟通的UIButton的类定义只是为了让你的按钮被用户所期望的行为方式。此外,从继承的UIButton,你的子类自动获得未来的任何改进或缺陷修复可能被应用到内部的UIButton行为。

该UIButton的类本身被定义为从UIControl,介绍常见的iOS上的所有用户界面控件的基本行为继承。反过来UIControl类从UIView的继承,赋予其功能常见于屏幕上显示的对象。从UIView的继承UIResponder,使其能够如水龙头,手势或震动响应用户的输入。最后,在树的根,UIResponder从NSObject的继承,如图1-3所示。

这里写图片描述

继承这条产业链意味着UIButton的任何自定义子类将继承不仅自身的UIButton申报的功能,但也依次在每个超类继承的功能。你最终与该表现得像个按钮的对象类,可以在屏幕上显示自己,响应用户的输入,与其他任何基本的可可触摸对象的沟通。

它保留继承链记住你需要使用任何类,以找出到底是什么可以做的是很重要的。提供了可可和可可触摸类参考文档,例如,可轻松导航任意类的每个超类。如果你不能找到你要找的内容在一类接口或引用,它很可能被定义或者在超记录的进一步向上的链条。

A类的接口定义预期的相互作用

一个面向对象编程的许多好处是提到这个想法较早所有你需要为了使用一个类来知道如何与它的实例进行互动。更具体地,一个目的应设计为隐藏其内部实现的细节。

如果您在iOS应用程序使用标准的UIButton,例如,您不必担心像素是如何操纵使按钮出现在屏幕上。所有你需要知道的是,您可以更改某些属性,如按钮的标题和颜色,并且相信当你把它添加到您的可视化界面,它会正确显示在您所期望的方式行事。

当你定义自己的类,你需要搞清楚这些公共属性和行为开始。你想要什么属性是公共访问?如果你让这些属性改变?如何做其他对象与类的实例沟通?

这些信息进入你的接口类,它定义你打算等对象与你的类的交互方式。 public接口从你的类,它构成了类实现的内部行为分别描述。在Objective-C接口和实现通常放置在单独的文件,所以你只需要进行公开的接口。

基本语法

于声明一个类接口的Objective-C的语法如下所示:

@interface SimpleClass : NSObject

@end

这个例子声明了一个名为SimpleClass类,它继承NSObject的。

公共属性和行为是在@interface声明中定义。在这个例子中,没有什么超越超类指定,因此预期可对SimpleClass实例的唯一功能是不同于NSObject的继承的功能。

属性控制访问对象的价值

对象往往有供公众访问属性。如果你定义一个类中记录保存的应用程序来代表一个人,例如,你可能决定你需要代表一个人的姓和名字符串的属性。

这些属性声明应该在界面中添加,如下所示:

@interface Person : NSObject

@property NSString *firstName;
@property NSString *lastName;

@end

在这个例子中,Person类声明了两个公共属性,这两者都是NSString类的实例。

这两个属性是Objective-C的对象,所以他们用星号来表示它们是C指针。他们还声明类似于C任何其他变量声明,因此需要在最后一个分号。

您可能决定增加一个属性来表示出生一个人的一年,让您在一年群体的人,而不是仅仅按名称排序。你可以使用一些对象的属性:

@property NSNumber *yearOfBirth;

但是这可能被认为是矫枉过正只存储一个简单的数值。一种选择是使用以C提供的基本类型,其中持有数量值,如整数之一

@property int yearOfBirth;

property属性指示数据可访问性和存储注意事项

所示的例子到目前为止,所有申报的,用于完善的公共访问属性。这意味着其它的目的可以读取和改变的属性的值。

在某些情况下,你可能会决定来声明一个属性是不打算改变。在现实世界中,一个人必须填写大量的文书工作,以改变他们的文档化姓氏或名字。如果你正在写正式的记录保存的应用程序,你可以选择指定一个人的名字的公共属性为只读,要求通过负责验证请求,并批准或拒绝它的中间对象所要求的任何变化。

目标C的属性声明可以包括属性的属性,这是用来表示,除其他外,一个属性是否意在只读。在官方记录保存的应用程序中,Person类的接口可能是这样的:

@interface Person : NSObject
@property (readonly) NSString *firstName;
@property (readonly) NSString *lastName;
@end

物业属性里面的关键字@property后面的括号中指定,并完全描述声明的公共属性暴露数据。

方法声明指明消息的对象可以接收

到目前为止,我们已经涉及描述一个典型的模型对象类或对象主要设计用来封装数据。在Person类的情况下,它可能就不会需要超出能够访问这两个声明的属性的任何功能。大多数类,但不包括任何附加的声明的属性的行为。

由于Objective-C的软件是从对象的大型网络建设,一定要注意这些对象可以通过发送消息互相交流是很重要的。在Objective-C而言,一个对象通过调用对象的方法将消息发送到另一个对象。

Objective-C的方法在概念上类似于C和其他编程语言的标准功能,虽然语法是完全不同的。 A C函数声明如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值