4-封装/继承/多态
2015-07-14 本文已影响100人
SoftKnife
People Lack Willpower,Rather Than Strength!
1.封装
-
概念:封装性就是隐藏实现细节,仅对外公开接口。
- 技术概念:是指隐藏对象的属性和实现的细节,仅对外提供公共的访问方法
-
好处:
- 将变化隔离;
- 提高安全性;
-
原则:
- 将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共的方法对其访问.
-
setter/getter
- setter作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值.
- getter作用:为调用者返回对象内部的成员变量的值.
- 体现了封装思想.
-
点语法:
- 注意:
- 点语法的本质是方法的调用,而不是访问成员变量.** 如果没有set和get方法,则不能使用点语法**。
- 不在要在getter 与 setter方法中使用本属性的点语法.
- 注意:
2.self关键字
+ 成员变量:成员变量是一个实例对象的具体状态特征,并且这些状态特征是可以改变的;
+ 对象方法:一个实例对象的行为,有可能会影响自身的某些状态特征.
> 对象方法可以通过 [[self class] +method]调用类方法
> 因为,既然有对象,那么肯定存在类,反之不然.
+ 类方法:类方法是某个类的行为,可以直接通过类名调用;如果在类方法中需要使用某些数据,必须通过参数传入;
> 它不能绕过对象直接访问成员变量。
> 因为有类并不一定有对象!
+ 类方法中的self
- self 就是类对象(类对象的指针).
- 通过类名调用类方法,其实就是给类对象发消息.
- 整个程序运行过程中,一个类只能有一个类对象.
+ 对象方法中的self:
- 在整个程序运行过程中,一个类可以有0个或多个对象.
-
全局变量成员变量局部变量:
- 从作用域的范围来看:全局变量 > 成员变量 > 局部变量
- 不同的作用域中的同名的变量:局部变量覆盖成员变量,成员变量覆盖全局变量.
对象方法中出现与成员变量同名的局部变量,如果想使用该成员变量可以通过self.成员变量名的方式
-
self使用注意:
- self只能在方法中用,一般只能调方法(最多可以访问public的属性),不能用来调函数.
- 一个方法内部self调用自己,会死循环.
-
super和self比较:
self | super |
---|---|
隐私参数 | 编译器指示符 |
它和super指向的是相同的消息接收者 | 只是告诉编译器在执行的时候,去调谁的方法 |
```
*self*: refers to the object receiving a message in objective-C programming.
*super*: is a flag that tells the compiler to search for the method implementation in a very different place. e. It begins in the superclass of the class that defines the method where super appears.It begins in the superclass of the class that defines the method where super appears.
```
3.继承:
-
注意:
- 继承不是复制一份,而是获得使用权!!!
- OC中是单继承的关系
- 子类和父类的关系也称为:(是一个)的关系(dog isa animal).
- 基类的私有属性能被继承,但子类不能访问.
-
继承中方法调用的顺序:
- 在自己类中找-->父类中找-->就去父类的父类-->直到找到基类(NSObject)-->如果NSObject都没有就报错了
-
继承的注意事项:
- 子类不能定义和父类同名的成员变量,私有成员变量也不可以(可见私有变量也被继承了).
4.多态
- 多态条件:
- 有继承关系
- 子类重写父类方法
- 父类指针指向子类对象
-> 为什么一定要重写?
: 如果没有重写,看下面的情况:
Person *p = [Student new];
[p study]
> 注意:这里Student有study方法.
> 如果我们想用p调用study,如果study方法是Student独有的方法,compile time父类指针无法响应子类方法的SEL值(NO ==[p repondsToSelector:@(method)])
-
多态优点:
- 简化了编程接口.它允许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。
编程接口就是一些抽象的行为的集合,从而 和 实现接口的类的区分开来。
- 代码扩展性和复用性更好一些.多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。
应用: 当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。
- 从宏观上看:一个父类指针作为参数时,可以传入多个子类对象.节省代码.
- 从微观上看:当某个方法出现新的形态时,如果想在不修改原方法特性的基础上增加新特性,那么就需要创建一个派生类,派生类中重写原方法.
- 简化了编程接口.它允许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。
-
多态能实现的支撑----OC语法特性:动态绑定
- 动态绑定:程序直到runtime才确定要对哪个对象发送消息去找对应SEL的方法.
OC不同于传统程序设计语言,它可以在runtime加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
- 动态绑定:程序直到runtime才确定要对哪个对象发送消息去找对应SEL的方法.
5.实例变量修饰符:
1.修饰符的意义
@public | @protected | @private | @package |
---|---|---|---|
(公开的) | (受保护的) | (私有的) | (框架级别的) |
在有对象的前下,任何地方都可以直接访问。 | 只能在当前类和子类的对象方法中访问 | 只能在当前类的对象方法中才能直接访问 | 作用域介于私有和公开之间,只要处于同一个框架中相当于@public,在框架外部相当于@private |
2.变量修饰符在子类中的访问:
- 1)@private私有成员是能被继承,不能直接访问,也不能被外部方法访问。
- 2)@public 公有成员能被继承,能直接方法,也能被外部方法访问。
- 3)@protected 保护成员能够被继承,能被子类直接访问,不能够被外部方法访问
- 注意:
- 1.@interface @end之间声明的成员变量,默认是protected
- 2.@property生成的变量,默认是@private
6.description陷阱
- 不要在description方法中同时使用%@和self
(NSString *)description {
return [NSString stringWithFormat:@"%@", self];
}
- 同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法;
- 当[NSString stringWithFormat:@“%@”, self]; 使用它时,循坏调用,导致系统会发生运行时错误。
- 当该方法使用NSLog(“%@”,self) 时候, 系统做了相关的优化,循坏调用3次后就会自动退出