0%

Objective-C_面向对象 — 封装、继承、多态

面向对象的三大特征:

  1. 封装 (Encapsulation)
  2. 继承 (Inheritance)
  3. 多态 (Polymorphism)

封装、权限修饰符(@public、@private、@protected)

  • 隐藏属性、方法或者实现细节的过程称之为封装
  • 权限修饰符用来修饰实例变量 , 用来控制实例变量的访问权限。
  • 在语法上,不存在私有方法。但约定:在 .m 文件中实现,但在 .h 文件中没有声明的方法称之为私有方法
#import <Foundation/Foundation.h>
@interface Car : NSObject {
/*    属性的封装
 *   1.使类的属性不让外部直接访问
 */  2.外部使用这个类时,不需要关心这个类具有哪些属性

//@public 修饰的成员变量,外部可以直接访问
//不建议直接使用,因为破坏了属性的封装性
@public
   NSString *_name;    //名称
   NSString *_color;   //颜色

//@private 是私有属性,只能在类的内部访问
// 子类不能访问private修饰的属性
@private
   float width;    //车宽

//@protected 受保护的属性,
//类的内部,子类都可以访问,类的外部不能访问
@protected  //默认的修饰
   float _capcity; //耗油量

@package  //修饰的变量只能在当前所在的框架中访问

}

/*方法的封装
1.对功能实现的细节隐藏于封装
2.保护属性
*/
- (void)run;

//封装还可以保护属性值的有效性
- (void)setCapicity:(float)capicity;

@end
//.m 文件实现中
//调用方法时可以对属性值的有效性进行判断
- (void)setCapicity:(float)capicity{
if (capicity < 0) {
    //给出错误处理
    return 0;
}
_capcity = capicity;
}

继承

  • 子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性。
  • 定义一个通用的类,它有基本的实例变量。子类可以继承了该类,就可以拥有这些实例变量。子类也可以定义自己的实例变量。
  • 被继承的类叫超类父类 (superclass), 继承超类的类叫子类派生类 (subclass)。
  • OC 中继承的语法规则为: @interface 子类 :父类
  • 子类自动继承父类的属性和方法
  • OC 语言的类都是单继承,即一个子类只能有一个父类。
  • 多继承即一个子类可以有多个父类,它继承了多个父类的特性

父类:

@interface ClassA : NSObject
{
int x;
} 
- (void) run; 
@end

子类:

@interface ClassB : ClassA  
- (void) printVar;
@end

方法重写

  • 通过方法重写,子类可以改变从父类继承的行为。
  • 被重写的方法定义必须与父类中的方法完全一样。
  • 方法重写必须满足两个条件 1. 必须要有继承关系;2. 重写方法的方法名、参数列表必须都一致;
    例如:重写 init 初始化方法。

多态

  • 多态是指同一种类型,具有多种表现形态。
  • 多态的条件:1. 必须存在继承关系。2. 子类重写父类的方法。3. 父类声明的变量指向子类对象。
  • 多态能够使来自不同类的对象定义相同名称的方法(不同的类可以有相同的方法名)。
  • 动态类型能使程序直到执行时才确定对象所属的类。
  • 动态绑定能使程序直到执行时才确定实际要调用的对象方法。

    Objective-C 系统总是跟踪对象所属的类:
    含义:先判定对象所属的类,然后在运行时确定需要动态调用的方法,而不是在编译的时候。

image

isKindOfClass:& isMemberOfClass:

  • isKindOfClass: 确定一个对象是否是一个类的成员,或者是派生自该类的成员。
  • isMemberOfClass: 确定一个对象是否是当前类的成员。

欢迎关注我的其它发布渠道