你已经看到处理分数的方法如何通过名称直接访问两个实例变量numerator和denominator。事实上,实例方法总是可以直接访问它的实例变量的。然而,类方法则不能,因为它只处理本身,并不处理任何类实例(仔细想想)。但是,如果要从其他位置访问实例变量,例如,从main函数内部来访问,该如何实现?在这种情况下,不能直接访问这些实例变量,因为它们是隐藏的。将实例变量隐藏起来的这种做法实际上涉及一个关键概念——“数据封装”。它使得编写定义的人在不必担心程序员(即类的使用者)是否破坏类的内部细节的情况下,扩展和修改其定义。数据封装提供了程序员和其他开发者之间的良好隔离层。
通过编写特殊方法来检索实例变量的值,可以用一种新的方式来访问它们。编写setNumerator:和setDenominator:方法用于给Fraction类的两个实例变量设定值。为了获取这些实例变量的值,我们需要编写新的方法。例如,创建两个名为numerator和denominator的新方法,用于访问相应的Fraction实例变量,这些实例是消息的接收者。结果是对应的整数值,你将返回这些值。以下是这两个新方法的声明:
–(int) numerator;
–(int) denominator;
下面是定义:
–(int) numerator
{
return numerator;
}
–(int) denominator
{
return denominator;
}
注意,它们访问的方法名和实例变量名是相同的,这样做不存在任何问题(虽然似乎有些奇怪)。事实上,这是很常见的情况。代码清单3-4用来测试这两个新方法。
// 访问实例变量的程序 – cont'd
#import <Foundation/Foundation.h>
//---- @interface 部分 ----
@interface Fraction: NSObject
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end
//---- @implementation 部分 ----
@implementation Fraction
{
int numerator;
int denominator;
}
-(void) print
{
NSLog (@"%i/%i", numerator, denominator);
}
-(void) setNumerator: (int) n
{
numerator = n;
}
-(void) setDenominator: (int) d
{
denominator = d;
}
-(int) numerator
{
return numerator;
}
-(int) denominator
{
return denominator;
}
@end
//---- program 部分 ----
int main (int argc, char *argv[])
{
@autoreleasepool {
Fraction *myFraction = [[Fraction alloc] init];
// 设置分数为1/3
[myFraction setNumerator: 1];
[myFraction setDenominator: 3];
// 使用两个新的方法显示分数
NSLog (@"The value of myFraction is: %i/%i",
[myFraction numerator], [myFraction denominator]);
}
return 0;
}
The value of myFraction is 1/3
NSLog语句显示发送给myFraction:的两条消息的结果,第一条消息检索numerator的值,第二条则检索denominator的值。
NSLog (@"The value of myFraction is: %i/%i",
[myFraction numerator], [myFraction denominator]);
在第一条消息调用时,numerator消息会发送给Fraction类的对象myFraction。在这个方法中,分数中numerator的实例变量的值被返回。记住,方法执行的上下文环境就是接收到消息的对象。当访问numerator方法并且返回numerator实例变量值的时候,会取得myFraction的分子并返回,返回的整数传入NSLog,从而显示出来。第二条消息调用时,denominator方法会被调用并返回myFraction的分母,它仍通过NSLog显示。
顺便说一下,设置实例变量值的方法通常总称为设值方法(setter),而用于检索实例变量值的方法叫做取值方法(getter)。对Fraction而言,setNumerator:和setDenominator:是设值方法,numerator和denominator是取值方法。取值方法和设值方法通常称为访问器(accessor)方法。
确定你已经理解了设值方法和取值方法的不同。设值方法不会返回任何值,因为其主要目的是将方法参数设为对应的实例变量的值。在这种情况下并不需要返回值。另一方面,取值方法的目的是获取存储在对象中的实例变量的值,并通过程序返回发送出去。基于此目的,取值方法必须返回实例的值作为return的参数。
你不能在类的外部编写方法直接设置或获取实例变量的值,而需要编写设值方法和取值方法来设置或获取实例变量的值,这便是数据封装的原则。你必须通过使用一些方法来访问这些通常对“外界”隐藏的数据。这种做法集中了访问实例变量的方式,并且能够阻止其他一些代码直接改变实例变量的值。如果可以直接改变,会让程序很难跟踪、调试和修改。
这里还应指出,还有一个名为new的方法可以将alloc和init的操作结合起来。因此,程序行
Fraction *myFraction = [Fraction new];
可用于创建和初始化新的Fraction。但用两步来实现创建和初始化的方式通常更好,这样可以在概念上理解正在发生两个不同的事件:首先创建一个对象,然后对它初始化。
本文节选自《Objective-C 程序设计(第4版)》
电子工业出版社出版
[美]Stephen G. Kochan(斯蒂芬·G·科昌)著
林冀 范俊朱奕欣译
分享到:
相关推荐
国民经济行业分类与国际标准行业分类(ISIC+Rev.4)的对照和匹配(供参考).docx
网络助手工具(亲测好用)
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
这是一款基于jQuery+HTML5实现的微信大转盘抽奖效果源码,是一款可配置奖品抽奖的jQuery大转盘抽奖代码,可实现点击按钮转轮旋转实现抽奖功能,效果逼真自然,是一款非常优秀的特效源码
自动驾驶控制-基于MPC的速度控制仿真 matlab和simulink联合仿真,基于mpc算法的速度控制,跟踪阶跃形式的速度和正弦形式的速度。
求解 2D 和 3D 分数矢量亥姆霍兹方程,用于非刚性图像配准Matlab代码.rar
springboot103抗疫物资管理系统,含有完整的源码和报告文档
这是2023年华南理工大学机器人校内赛五山五狼—车车难造队的机械建模开源,我是本队机械建模队员杨欣然_-
将多个图像显示为子图的蒙太奇Matlab代码.rar
labview源码参考示例,可供参考学习使用
内容概要:本文档主要聚焦于2024年秋季学期高维数据分析课程的第六次作业,涉及多个关于复杂网络分析的重要概念和技术。具体涵盖:基于图论的基本证明如节点度与共同邻居的数学表达形式;对网络社区结构进行划分,并通过模态性公式评价这种划分的效果;针对实际社交网络数据集利用随机块模型和社会经济回报模型(SCORE)来进行高效的社区识别任务;以及深入探讨了矩阵的核范数及其与谱范数间的关系,强调了它们在解决现实生活中大型稀疏矩阵问题方面的重要性。 适合人群:面向正在学习数据挖掘、机器学习等相关专业的大三及以上的学生,特别是有兴趣深入了解图论及其在网络科学中具体应用的研究人员。 使用场景及目标:该文档用于帮助学生更好地掌握高维数据分析技巧,在实际项目实践中提高解决问题的能力。通过本练习可以加深对于社交网络构建、模块化计算方法的认识,同时也能加强对线性代数里关键概念的理解。这对于准备从事数据分析相关工作或进一步深造的同学非常有益。 其他说明:这份PDF材料包含了大量详细的数学推导步骤,以及具体的评分标准和作业完成时间限制(截止日期:12月29日星期日晚上十点)。为了更好地完成这门课的任务,建议配合教科书和其他参考资料一起使用,鼓励学生积极思考每个问题背后的原理。
教育培训机构劳动合同
①数据来源:自己从cnrds数据库下载的原始数据,未做任何处理 ②数据年份:不同表格不一致,很多表格比如上市公司绿色专利申请与获得都是从1991年开始的,目前除了引用里的被引用信息更新到23年11月底,其余均更新到23年底 ③数据内容:两个表格 数据清单: 各省市绿色专利申请与获得(内部是地级市) 各省市绿色专利申请情况 各省市绿色专利获得情况
毕业设计-基于Java+SpringBoot的校园互助系统微信小程序源码+数据库.zip文件 该项目是个人项目源码,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!!!评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 该项目是个人项目源码,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!!!评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于微信小程序的校园互助系统源码+数据库.zip文件 该项目是个人项目源码,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!!!评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于微信小程序的校园互助系统源码+数据库.zip文件 该项目是个人项目源码,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运
springboot128中小企业人事管理系统代码,含有完整的源码和报告文档
管理员功能 用户管理 管理各类用户(社团负责人、会员)的注册、审核、修改和删除。 设置不同角色的权限,确保系统安全性。 社团管理 创建、编辑和删除社团信息,包括社团名称、简介、活动类型等。 审核新申请的社团,并管理社团的状态(正常、暂停、注销)。 活动管理 发布、编辑和删除社团活动信息,包含活动主题、时间、地点和参与人数。 查看活动报名情况和参与者列表。 财务管理 管理社团资金,包括收支记录、预算编制和财务报表生成。 支持费用报销流程,审核并记录社团开支。 数据统计与报告 生成各类统计报告,如社团活动参与情况、会员增长趋势等。 分析社团运营状况,为决策提供数据支持。 社团负责人功能 社团管理 查看和编辑社团基本信息及介绍,更新社团动态。 管理社团内的成员,包括添加、移除和调整角色。 活动策划 创建新活动,设置活动细节(时间、地点、内容、报名方式)。 发布活动通知,通过系统推送给社团成员。 报名管理 查看活动报名情况,管理参与人员名单。 发送活动提醒与通知,确保会员及时了解活动信息。 沟通交流 使用内部消息系统与社团成员进行沟通,发布公告和通知。 建立论坛或讨论区,促进
低通滤波器 滤波算法 滤波
基于滑膜控制smc的3辆协同自适应巡航控制,上层滑膜控制器产生期望加速度,下层通过油门和刹车控制车速,实现自适应巡航控制。 个人觉得从结果图中看出基于滑膜控制的效果非常好,不亚于模型预测控制mpc 并且在实车试验很方便。 文件包含acc巡航建模资料和滑膜控制的资料,还有详细教你运行仿真的步骤,非常的详细,比一般只给文件仿真详细多啦,还有我本人滑膜控制的总结,对于滑膜控制的学习很有帮助。
foc滑膜观测器(SMO+PLL)matlab模型,仿真里面是直接0速闭环启动的效果,当然这是仿真,应用到硬件肯定要加开环启动,目前已经在M4的硬件中实现了,效果还不错,现在出这个模型,matlab 的版本是2021b
springboot158基于springboot的医院资源管理系统,含有完整的源码和报告文档