小糖出品:面向对象三大特性之封装

来源:互联网 发布:淘宝上怎么能卖酒 编辑:程序博客网 时间:2024/04/30 00:42

                           这篇博文呢,小糖就来谈谈面向对象的三大特性之一的封装。

                           之前一直都在说oc中的类、对象、方法,是时候来说说面向对象的三大特性了。我们都知道,面向对象有三大特性:封装、继承和多态。那么,何为封装,何为继承,何为多态呢?别急,我们先来说说封装。

                          封装,从字面上来看,感觉是把某个东西封装起来,把内部东西隐藏起来,不让人看到。那么,oc中的封装是这样吗?其实,意思很相近。oc中的封装,就是将属性、方法还有实现细节隐藏起来的过程,将信息隐藏到内部,不让外部程序直接访问内部信息,而是通过该类提供的方法来对内部信息进行访问和操作。那为什么我们需要对其进行封装呢?就拿汽车来说吧,汽车的一些东西我们完全无需关心的,而且我们不能随意修改的,比如引擎的型号,我们无法更改引擎的型号,我们只需关心这个车能干什么就可以。为了防止某些属性或方法被修改,我们就需要对类进行封装,封装后的类只需要提供一些方法供人使用即可。

                          我们使用封装主要是为了实现一下目的:

                              1.隐藏类的实现细节;

                              2.让使用者只能通过事先预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问;

                              3.可进行数据检查,从而有利于保证对象信息的完整性;

                              4.便于修改,提高代码的可维护性;

使用封装,其实就是把该隐藏的隐藏起来,把该暴露的暴露出来。说了这么多,我们究竟该怎样去进行封装呢?

                          oc提供了4个访问控制符,这4个分别是@private、@package、@protected、@public。这4个访问控制符都是如何控制的呢?让我们来详细地说说;

                               @private:当前类访问权限,从字面上来看,使用了该访问控制符之后,这些属性只能在当前类中进行访问,无法在其他类包括子类中使用。很明显,这个控制符相当于彻底隐藏成员变量。在类实现部分定义的成员变量默认使用该控制符。

                               @package:使用该控制符之后,则那些属性可以在当前类以及当前类实现的同一个映像的任意地方访问。这个控制符是部分隐藏成员变量。

                               @protected:使用该控制符后,那些成员可以在当前类或者当前类的子类中的任意地方访问。这个控制符也是部分隐藏成员变量,而且,在类声明部分定义的成员变量默认使用该控制符。

                               @public:使用该控制符之后,那些成员可以不受限制在任意地方访问,不论在哪,都可以。这个控制符相当于完全暴露成员变量。

上述的有个地方小糖觉得有些不好理解,就是在@package中说的同一映像,什么是同一映像呢?其实,就是编译后生成的同一框架或者同一个执行文件。这里不好说清楚,在以后若有用到该控制符的时候,会再详细说明。

                        接下来,我们通过例子来具体说明一下。就拿上面说到的汽车来做例子吧。现在,小糖先定义一下汽车类:

                                                @interface Car :NSObject{

                                                          float cap;

                                                 }

                                                @end

像上面这样在类接口部分定义的成员,默认的是@protected控制符。现在我们如果这么写的话:

                                                @interface Car:NSObject{

                                                @public

                                                         float cap;

                                                 }

                                                @end

像上面这样定义的,用了@public控制符的话,说明我们定义的cap可以在任意地方访问。我们可以在main中这么写:

                                               Car * car = [[Car alloc] init];

                                               car->cap = 3.6;

                                               NSLog(@"%@",car->cap);

这样运行的话,输出的结果就是3.60000。说明这个成员无需使用类的方法就可以直接访问。那么如果我们这么定义的话:

                                             @interface Car:NSObject{

                                             @private

                                                       float cap;

                                              }

                                             @end

当你这么定义的话,如果main里面再像上面那样写的话,编译器就会报错的。上面说到@private是私有属性,如果我们要访问这个这个成员的话,我们该怎么办呢?那样的话我们就需要用setter和getter方法了。提供方法给你调用,就可以访问成员了。至于@protected这个控制符,跟我们平常在类声明里面定义的成员变量所使用的方法差不多,这里就不多做解释。

                        关于封装,小糖就先讲到这里,有补充的话会在后续博客中说明。封装是面向对象三大特性之一,故我们都应该好好理解,当然也包括小糖。小糖也还在学习之中,如果有啥写的不对的地方,欢迎纠错。就这样啦,我们下篇博客再见咯。

0 0
原创粉丝点击