当前位置: 首页 > 编程日记 > 正文

实例变量的访问及数据封装

你已经看到处理分数的方法如何通过名称直接访问两个实例变量numerator和denominator。事实上,实例方法总是可以直接访问它的实例变量的。然而,类方法则不能,因为它只处理本身,并不处理任何类实例(仔细想想)。但是,如果要从其他位置访问实例变量,例如,从main函数内部来访问,该如何实现?在这种情况下,不能直接访问这些实例变量,因为它们是隐藏的。将实例变量隐藏起来的这种做法实际上涉及一个关键概念——“数据封装”。它使得编写定义的人在不必担心程序员(即类的使用者)是否破坏类的内部细节的情况下,扩展和修改其定义。数据封装提供了程序员和其他开发者之间的良好隔离层。

       通过编写特殊方法来检索实例变量的值,可以用一种新的方式来访问它们。编写setNumerator:setDenominator:方法用于给Fraction类的两个实例变量设定值。为了获取这些实例变量的值,我们需要编写新的方法。例如,创建两个名为numeratordenominator的新方法,用于访问相应的Fraction实例变量,这些实例是消息的接收者。结果是对应的整数值,你将返回这些值。以下是这两个新方法的声明:

–(int) numerator;

–(int) denominator;

下面是定义:

–(int) numerator

{

   return numerator;

}

 

–(int) denominator

{

   return denominator;

}

注意,它们访问的方法名和实例变量名是相同的,这样做不存在任何问题(虽然似乎有些奇怪)。事实上,这是很常见的情况。代码清单3-4用来测试这两个新方法。

代码清单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;

}

 

代码清单3-4  输出

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:是设值方法,numeratordenominator是取值方法。取值方法和设值方法通常称为访问器(accessor)方法。

确定你已经理解了设值方法和取值方法的不同。设值方法不会返回任何值,因为其主要目的是将方法参数设为对应的实例变量的值。在这种情况下并不需要返回值。另一方面,取值方法的目的是获取存储在对象中的实例变量的值,并通过程序返回发送出去。基于此目的,取值方法必须返回实例的值作为return的参数。

你不能在类的外部编写方法直接设置或获取实例变量的值,而需要编写设值方法和取值方法来设置或获取实例变量的值,这便是数据封装的原则。你必须通过使用一些方法来访问这些通常对“外界”隐藏的数据。这种做法集中了访问实例变量的方式,并且能够阻止其他一些代码直接改变实例变量的值。如果可以直接改变,会让程序很难跟踪、调试和修改。

这里还应指出,还有一个名为new的方法可以将allocinit的操作结合起来。因此,程序行

Fraction *myFraction = [Fraction new];

可用于创建和初始化新的Fraction。但用两步来实现创建和初始化的方式通常更好,这样可以在概念上理解正在发生两个不同的事件:首先创建一个对象,然后对它初始化。

 

 

本文节选自《Objective-C 程序设计(4)

电子工业出版社出版

[]Stephen G. Kochan(斯蒂芬·G·科昌)著

林冀  范俊朱奕欣译

相关文章:

清华成立视觉智能研究中心,邓志东任中心主任

整理 | 阿司匹林出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;6月21日&#xff0c;清华大学人工智能研究院视觉智能研究中心正式成立&#xff0c;清华大学副校长、清华大学人工智能研究院管委会主任尤政院士&#xff0c;清华大学人工智能研究院院长张钹院士出席成…

Java并发编程(一)Thread详解

一、概述 在开始学习Thread之前&#xff0c;我们先来了解一下 线程和进程之间的关系&#xff1a; 线程(Thread)是进程的一个实体&#xff0c;是CPU调度和分派的基本单位。 线程不能够独立执行&#xff0c;必须依存在应用程序中&#xff0c;由应用程序提供多个线程执行控制。 线…

MFC如何打开文件路径

转自&#xff1a;http://linyangmumu.blog.163.com/blog/static/6903134920101024419380/ 1.void OpenFile&#xff08;&#xff09; { CString m_FileDir; BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO)); bi.hwndOwner m_hWnd; bi.ulFlags BIF_RETURNONL…

HDOJ_ACM_数塔

Problem Description在讲述DP算法的时候&#xff0c;一个经典的例子就是数塔问题&#xff0c;它是这样描述的&#xff1a;有如下所示的数塔&#xff0c;要求从顶层走到底层&#xff0c;若每一步只能走到相邻的结点&#xff0c;则经过的结点的数字之和最大是多少&#xff1f;已经…

会数据分析的人别再低调了,我怕你会因此错失100万奖金

大家好我是一般周一不冒头一冒头就不一般的柚柚今天我给大家带来了一个好消息那就是“易观方舟Argo杯数据创客大赛”开始接受报名了&#xff01;请不要怀疑就是那个国内领先的大数据公司——『易观』联合20家创新企业筹备了整整两个月的大赛正规、专业、含金量极高&#xff01;…

CxImage类库的简介

转自&#xff1a;http://www.sudu.cn/info/html/edu/20080403/259688.html CxImage类库是个优秀的图像操作类库。他能快捷地存取、显示、转换各种图像。有的读者可能说&#xff0c;有那么多优秀的图像库&#xff0c;如OpenIL,FreeImage,PaintLib等等&#xff0c;他们可谓是功能…

MySQL 5.5 服务器变量详解(二)

innodb_adaptive_flushing{ON|OFF} 设定是否允许MySQL服务器根据工作负载动态调整刷写InnoDB buffer pool中的脏页的速率。动态调整刷写速率的目的在于避免出现IO活动尖峰。默认值为ON。作用范围为全局级别&#xff0c;可用于选项文件&#xff0c;属动态变量。innodb_adaptive_…

一文掌握异常检测的实用方法 | 技术实践

作者 | Vegard Flovik译者 | Tianyu责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】今天这篇文章会向大家介绍几个有关机器学习和统计分析的技术和应用&#xff0c;并展示如何使用这些方法解决一些具体的异常检测和状态监控实例。相信对一些开发…

票据自动处理系统著名研究团队

国际上对票据自动处理系统的研究始于上世纪80年代&#xff0c;俄罗斯、美国、加拿大、日本、巴西等国在这个领域的研究工作开展得比较深入&#xff0c;著名的研究团体如加拿大Concordia大学的CENPARMI中心、MIT的PROFIT实验室、俄罗斯ABBYY软件公司、Mitek Systems公司CheckQue…

iOS开发之AVKit框架使用

2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一、引言 在iOS开发框架中&#xff0c;AVKit是一个非常上层&#xff0c;偏应用的框架&#xff0c;它是基于AVFoundation的一层视图层封装。其中相关文件和类都十分简单&#xff0c;本篇博客主要整…

DirectX10 学习笔记2:在多文档框架中初始化DirectX 10

显示功能是在视图类中完成的&#xff0c;所以DX10的初始化及绘制工作都是视图类中完成。 首先建立一个多文档工程&#xff0c;工程名为02_01&#xff0c;在视图类头文件中加载相关的库&#xff0c;并包含头文件&#xff1a; 在视图类的头文件中添加DX10相关的成员&#xff1a; …

碾压Bert?“屠榜”的XLnet对NLP任务意味着什么

作者张俊林&#xff0c;中国中文信息学会理事&#xff0c;中科院软件所博士。目前担任新浪微博机器学习团队 AI Lab 负责人。在此之前&#xff0c;张俊林曾经在阿里巴巴任资深技术专家并负责新技术团队&#xff0c;以及在百度和用友担任技术经理及技术总监等职务。他是技术书籍…

ORACLE中通过DBMS_CRYPTO包对表敏感字段进行加密

http://doc.primeton.com/pages/viewpage.action?pageId4917998

02 使用百度地图获得当前位置的经纬度

O 需求 通过百度地图&#xff0c;获取用户当前位置的经纬度 一 准备 确保你已按照上篇《01 如何将百度地图加入IOS应用程序&#xff1f;》完成了相关功能。本篇将在上一篇的基础上进行修改。 二 编码 (New标示本次新添加的代码&#xff1b;Delete表示本次需要删除的代码&#x…

中文NLP的分词真有必要吗?李纪为团队四项任务评测一探究竟 | ACL 2019

作者| Yuxian Meng、Xiaoya Li、Xiaofei Sun、Qinghong Han、Arianna Yuan、 Jiwei Li译者 | Rachel责编 | Jane出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】通常&#xff0c;中文文本处理的第一步称为分词&#xff0c;这好像已经成为一种“共识”&#…

Netty 粘包 拆包 编码 解码 序列化 介绍

目录&#xff1a; 粘包 & 拆包及解决方案 ByteToMessageDecoder基于长度编解码器基于分割符的编解码器google 的 Protobuf 序列化介绍其他的前言 Netty 作为一个网络框架&#xff0c;对 TCP 连接中的问题都做了全面的考虑&#xff0c;比如粘包拆包导致的半包问题&#xff0…

matlab 全局变量

转自&#xff1a;http://matlab.net.cn/matlabjichu/2010/201005/265.html 如果你要多于一个函数共用一个简单的变量&#xff0c;简单的处理方法就是把这个变量在所有函数中定义为global全局变量。在命令行做同样的事情&#xff0c;如果你要工作空间访问上述变量。这个全局变量…

java 解决Html table的rowspan问题(osc处女作)

2019独角兽企业重金招聘Python工程师标准>>> 假如有如下html代码需要解析 <table border"1"><tr><td rowspan"3">1</td><td>1</td><td>1</td><td>1</td></tr><tr>&l…

基于C++的OpenCV常用函数

C版本的好处&#xff1a; 1、在于可以尽量避免使用指针这种危险的东西&#xff1b; 2、不用费心去release资源了&#xff0c;因为在其destructor里面&#xff0c;系统会自动帮你搞定。 3、在某些情况下会比C版本运行速度快。 在文件中包含 using namespace cv; 1. i…

基于GAN的图像水印去除器,效果堪比PS高手

作者 | 李翔转载自视说AI&#xff08;ID:techtalkai&#xff09;简介&#xff1a;李翔&#xff0c;国内某互联网大厂AI民工&#xff0c;前携程酒店图像技术负责人&#xff0c;计算机视觉和深度学习重度爱好者&#xff0c;在ICCV和CVPR等会议上发表论文十余篇。写在前面当前互联…

Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

作者 | 机智的王知无转载自大数据技术与架构&#xff08;ID: import_bigdata&#xff09;一、Flink SQL 背景Flink SQL 是 Flink 实时计算为简化计算模型&#xff0c;降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。自 2015 年开始&#xff0c;阿里巴巴开始…

SQL SERVER中ROLLUP的用法

cube操作符 要使用cube&#xff0c;首先要了解group by 其实cube和rollup区别不太大&#xff0c;只是在基于group by 子句创建和汇总分组的可能的组合上有一定差别&#xff0c; cube将返回的更多的可能组合。如果在 group by 子句中有n个列或者是有n个表达式的话&#xff0c; s…

Mybait缓存机制

MyBatis同大多数ORM框架一样&#xff0c;提供了一级缓存和二级缓存的支持。 一级缓存&#xff1a;其作用域为session范围内&#xff0c;当session执行flush或close方法后&#xff0c;一级缓存会被清空。 二级缓存&#xff1a;二级缓存和一级缓存机制相同&#xff0c;但是可以自…

vs2008常用操作汇总

1、OpenCV2.1环境配置&#xff1a; (1)、Tools-->Options-->Projects and Solutions-->VCDrectories&#xff1a; Show directories for选择include files&#xff0c;加入目录 D:/Program Files/OpenCV2.1/include/opencv &#xff1b;Show directories for选择libra…

深度学习已至“瓶颈”?英特尔:数据处理是一剂良药

【导读】霍金弟子Alan Yuille在前不久发表言论称&#xff0c;至少在计算机视觉领域&#xff0c;深度学习的瓶颈已至。然而&#xff0c;人工智能与大数据的发展相辅相成&#xff0c;数据将会推动人工智能的发展&#xff0c;促进更多技术应用落地&#xff0c;将人工智能带入一个新…

WIN32 C++ 遍历文件夹

转自&#xff1a;http://blog.csdn.net/lizhigang770/archive/2010/11/30/6045242.aspx 一、先介绍一个结构 WIN32_FIND_DATA typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; // 文件属性 FILETIME ftCreationTime; // 文件创建时间 FILETIME ft…

UIView淡入淡出动画

小小原创&#xff0c;转载请注明出处&#xff1a;http://iphone.xiaoxiaostudio.net 如果你觉得为某个UIView 加载一个全新的View在这个UIView上面时&#xff0c;想要隐藏时setHidden显得太突兀了&#xff0c;我们可以给它增加一些动画&#xff0c;iOS上默认提供了一些动画&…

sass的继承,混合宏,占位符的用法总结

SCSS中混合宏使用 mixin mt($var){ margin-top: $var; }.block { include mt(5px);span { display:block; include mt(5px); } }extend如何工作 .icon {transition: background-color ease .2s;margin: 0 .5em;}.error-icon {extend .icon;/*错误图标指定的样式... */}.info-i…

js中cookie的使用详细分析

2019独角兽企业重金招聘Python工程师标准>>> JavaScript中的另一个机制&#xff1a;cookie&#xff0c;则可以达到真正全局变量的要求。 cookie是浏览器 提供的一种机制&#xff0c;它将document 对象的cookie属性提供给JavaScript。可以由JavaScript对其进行控制&a…

从事JAVA 20年最终却败给了Python,哭了!

之前遇到一个老师&#xff0c;他从事Java行业20年了&#xff0c;在Python兴起的时候&#xff0c;他周围的其他同行们都在纷纷学习Python方面的知识&#xff0c;连他的学生也问他“老师&#xff0c;你为什么不学Python呢&#xff1f;”。当这位听到学生这个问题的时候&#xff0…