OC-类有三大特性:封装 继承 多态

来源:互联网 发布:学校电铃知乎 编辑:程序博客网 时间:2024/06/05 02:06

01).封装

   封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。简而言之,信息隐藏,隐藏对象的实现细节,不让用户看到,以此来增强安全性和简化编程,进而达到封装的目的。   使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。

访问修饰符:private、protect、public、Internal

private:私有的,不可供外部访问的信息,只有类本身能存取.系统默认@private

protect:受保护的,类和派生类可以存取.

Internal:只有同一个项目中的类可以存取.

Public:外部可以直接访问 person->name = @“jack”;

   //封装 (setter和getter)成对出现    - (void)setName:(NSString *)name;//声明    - (NSString *)name;//声明    - (void)setName:(NSString *)name //实现    {        _name = name;    }    - (NSString *)name//实现    {        return _name;    }    [p setName:18];//赋值    [p name];      //取值    //只有getter没有setter,叫做只读封装

扩展:如何让1个方法不被外界访问,只需要在.m文件中实现这个方法,不需要在头文件中定义,即只有实现,没定义.

02).继承

  OC 的继承具有 单继承 的特点,每个子类都只能有一个直接父类。然而,他可以有无限多个间接父类。

当子类继承父类时,子类可以得到父类的:

1.全部成员变量

2.全部方法

03).多态

  一种事物的多种形态。不同类的对象可以定义共享相同名称的方法,这个就是多态的表现形式。

实现多态的条件:

1.必须存在继承关系

2.子类重写父类的方法

3.父类声明的变量指向子类对象

OC指针类型的变量有两个:编译时类型和运行时类型。编译时类型由声明变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现多态。

父类:动物类 HMAnimal.h

#import <Foundation/Foundation.h>@interface HMAnimal : NSObject{    //年龄    int _age;}//吃-(void)eat;//跑-(void)run;@end

父类:动物类HMAnimal.m

#import "HMAnimal.h"@implementation HMAnimal//吃-(void)eat{    NSLog(@"动物在吃");}//跑-(void)run{    NSLog(@"动物会跑");}@end

子类:狗狗类 HMDog.h

#import "HMAnimal.h"@interface HMDog : HMAnimal//dog类已经有了父类的属性和行为//狗特有的行为-(void)lookHome;@end

子类:狗狗类 HMDog.m

#import "HMDog.h"@implementation HMDog//重写父类的方法-(void)eat{    NSLog(@"狗正在吃芝麻酱和红糖");}-(void)run{    NSLog(@"狗一边叫,一边跑");}-(void)lookHome{    NSLog(@"狗会看家");}@end

运行 main.m

#import <Foundation/Foundation.h>#import "HMDog.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        HMAnimal *ani1 = [HMDog new];//父类指针指向子类对象,这就是多态        [ani1 eat]; //运行结果由实际赋给该变量的对象决定        [ani1 run];    }    return 0;}

2017-06-20 23:17:15.450844+0800 多态[2295:564455] 狗正在吃芝麻酱和红糖
2017-06-20 23:17:15.451833+0800 多态[2295:564455] 狗一边叫,一边跑