黑马程序员技术交流社区

标题: 关于封装中set,get的疑问 [打印本页]

作者: 曹雨    时间: 2014-7-1 17:57
标题: 关于封装中set,get的疑问
本帖最后由 曹雨 于 2014-7-6 18:06 编辑

@interface Student : NSObject
{

//只允许外界访问no,不允许修改no 只需要提供get方法,也就是只读。
int no;
}
问题1:在这里no的值不就是0,也不允许在声明这里初始化,它的值就是0了?只读的话没别的可能值?
问题2:set方法不也可以修改数据么,只是多了一个过滤,用方法修改变量,就叫不让外界知道内部细节?保证成员变量安全性?set完毕后,成员变量数值改变了吗?
问题3:封装屏蔽内部的赋值过程.屏蔽的过程是set,get方法内部吗?对外部来说我们看到的与不屏蔽有什么不同。、

请各位大神指教啊

作者: fantacyleo    时间: 2014-7-1 18:26
所谓"外界",指的是类声明和类实现范围以外的代码,比如说main函数中。在类实现中,你只需要变量名就能直接访问成员变量,无需getter和setter
作者: 敷衍ゝ微笑掩盖    时间: 2014-7-1 18:48
对于问题2,给一个成员变量设置了private后,外面的类就不能直接访问这个变量,在一定程度上是保证了成员变量的安全性的,你不能直接操作里面的成员变量,肯定就不知道里面的成员变量做了什么什么细节上的操作,你不能只从set方法这一个方面来说。你set值是相对一个对象的,你set后,相应的对象里面的成员变量的值就会改变
作者: 曹雨    时间: 2014-7-2 15:01
敷衍ゝ微笑掩盖 发表于 2014-7-1 18:48
对于问题2,给一个成员变量设置了private后,外面的类就不能直接访问这个变量,在一定程度上是保证了成员变 ...

谢谢,明白了
作者: m573555543    时间: 2014-7-2 23:45
@interface Student : NSObject
{

//只允许外界访问no,不允许修改no 只需要提供get方法,也就是只读。
int no;

问题1:在这里no的值不就是0,也不允许在声明这里初始化,它的值就是0了?只读的话没别的可能值?

答: 其实在调用的时候,也就是new的时候会给成员变量初始化,这里面就用到了以后会讲的new 可以分成alloc(分配存储空间),init(初始化对象),因为有init,他的作用是在初始化的 时候让成员变量在创建的时候默认值为0.如果想要他的初始化不为0的话,可以重写他的init方法。

问题2:set方法不也可以修改数据么,只是多了一个过滤,用方法修改变量,就叫不让外界知道内部细节?保证成员变量安全性?set完毕后,成员变量数值改变了吗?

答: 这个怎么说呢,先来说说成员变量的作用域有4个(1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。
(2)@protected (受保护的)只能在当前类和子类的对象方法中访问
(3)@private (私有的)只能在当前类的对象方法中才能直接访问
(4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问
现在的问题是:我们不可以让人谁便的来修改我们好不容易写出来的代码,这个时候我们就想到了封装。可以包装一些代码,将变化隔离。
而:set 则是让给外界的一个方法可以让外界来修改成员变量的值。



问题3:封装屏蔽内部的赋值过程.屏蔽的过程是set,get方法内部吗?对外部来说我们看到的与不屏蔽有什么不同。、
答: 就我个人的理解,封装屏蔽的是恶意的随意的修改代码,屏蔽的话你只能通过set方法来修改他,不屏蔽的话你可以直接成员变量来修改他。也就不关get方法的什么事情了。


作者: yueyuanlin    时间: 2014-7-3 12:17
说的挺好的!
作者: 曹雨    时间: 2014-7-6 18:05
m573555543 发表于 2014-7-2 23:45
@interface Student : NSObject
{

哇,太感谢了,{:3_64:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2