OC面向对象(上)

OC面向对象(上) OC面向对象(上)文章目录OC面向对象(上)隐藏与封装访问控制符类的继承特性super关键字用法多态特点注意事项总结隐藏与封装封装是指将数据属性和操作数据的方法行为捆绑在一起形成一个独立的单元——也就是“类”。类对外只暴露必要的接口如方法而将内部实现细节隐藏起来。访问控制符public—— 公开本类中可以访问。子类中可以访问。外部代码其他类可以通过对象名-变量名直接访问。特点完全公开任何地方都能直接读写严重破坏封装性应避免使用。protected——受保护默认本类中可以访问。子类中可以访问。外部代码不能直接访问。特点如果不指定修饰符默认就是protected。它允许子类直接访问父类的实例变量是封装性和继承性之间的平衡。private——私有本类中可以访问。子类中不能直接访问。外部代码不能直接访问。特点严格隐藏只有定义该变量的类自身能访问子类也无法直接使用必须通过父类提供的公共方法操作。package——包括可见(映像内)本类中可以访问。同一映像可执行文件或动态库内的其他类可以访问。不同映像的外部代码不能直接访问。特点介于public和protected之间。主要用于框架设计允许框架内部多个类之间互相访问实例变量但对框架外部的应用程序隐藏。在单一可执行文件如 App 主程序中package效果等同于public。#import Foundation/Foundation.h interface Person : NSObject { private NSString *_ssn; // 私有变量 } - (void)setSsn:(NSString *)ssn; - (NSString *)ssn; end四个控制符在类里的使用方式都是类似的类的继承// 父类基类 interface Animal : NSObject - (void)eat; end // 子类派生类继承自 Animal interface Dog : Animal - (void)bark; end现在我们创建了两个类Animal是父类Dog是子类子类Dog自动拥有父类Animal的所有方法和属性包括实例变量但受访问权限限制子类也可以添加自己的新方法和属性。对于子类对父类实例变量的访问权限可以用四个访问控制符进行限定只有用private的实例变量子类中不可直接访问特性在OC语言里一个子类只能有一个直接父类无数个间接父类所有 Objective-C 类最终都继承自NSObject所有OC类都可以调用NSObject里面的方法super关键字在子类中可以通过super关键字调用父类被重写的方法或者父类的原始实现。super就是让编译器从当前类的父类开始查找方法的实现。用法在init方法中先调用父类的初始化- (instancetype)init { self [super init]; // 调用父类的 init if (self) { // 子类自己的初始化 } return self; }在重写的方法中保留父类的行为implementation Dog - (void)eat { [super eat]; // 先调用父类的 eat 方法 NSLog(狗啃骨头); } end如果子类重写了某个方法又想使用父类的原始版本也可以用super调用多态多态也是OC语言三大特性之一它允许不同类的对象对同一消息做出不同的响应。简单来说就是“一个接口多种实现”。在 Objective-C 中多态的核心是动态绑定——方法的调用不是在编译时决定而是在运行时根据对象的实际类型来确定。特点同一接口多种实现父类定义了一个方法子类可以重写该方法。当把子类对象当作父类类型使用时调用该方法会执行子类的版本。动态性代码在运行时才决定具体调用哪个方法这给程序带来了极大的灵活性。基于继承的多态前提有一个父类基类声明了方法子类重写该方法。(调用super不属于多态)使用用父类类型的指针或id指向子类对象调用该方法。当然即使两个类没有相同的父类但是遵循统一个协议依然可以实现多态基于协议的多态前提定义一个协议多个不相关的类遵循该协议并实现方法。使用用id协议名类型的变量指向这些对象调用协议方法。注意事项多态依赖于继承或协议和方法重写。如果子类没有重写父类的方法则调用父类的实现。在 Objective-C 中类方法也可以被继承和重写同样有多态特性但调用时通过类名实际也是动态查找。多态与动态绑定是运行时特性不影响编译时的类型检查。不过编译器会根据静态类型给出一些警告比如调用了静态类型中不存在的方法。总结本篇文章是对OC语言的初步学习能够对OC语言的封装和多态两个特点有些了解对后面的学习非常重要