OC第三讲(Inherit 继承)

来源:互联网 发布:七彩虹淘宝旗舰店 编辑:程序博客网 时间:2024/05/16 13:06

一:

main.m文件中:

#import

#import "Person.h"

#import "Man.h"

#import "Bike.h"

#import "RoadBike.h"

int main(int argc, const char * argv[]) {

    //OC中的继承特点

    //1.单向继承, 一个父亲可以有多个子类, 一个子类只能有一个父类

    //2.单根继承根类(基类)NSObject

    

    //继承 子类可以继承父类的特征和行为

    

    //NSObject , 基类内部定义了常用的方法

    //+alloc,   -init

    NSObject *object = [[NSObject allocinit];

    

    Person *person = [[Person allocinitWithName:@"人类"age:1000 gender:@"未知"];

    

    NSLog(@"%@",person.name);

    NSLog(@"%@",person.gender);

    NSLog(@"%ld",person.age);

    //%@:打印对象, <<span style="font-family: 'Heiti SC Light';" se-mark="1">类名: 地址>

    NSLog(@"%@",person);

    

    [person sayHi];

    

   //建立继承关系后, 子类可以继承父类

    //1.实例变量 public, protected

    //2.公开的方法

    

    //一个方法可以根据是否在*.h中声明分为

    //1.如果在*.h中写了声明, 方法是公开的, 可以在类内部和外部进行使用

    //1.如果在*.h中写了声明, 方法是私有的, 只能在类的内部进行使用

    //: OC没有绝对的私有方法

    Man *man = [[Man allocinitWithName:@"小头爸爸" age:34gender:@""];

    man.color = @"绿色";

    [man sayHi];

    [man work];

    

    //方法调用的过程

    //1.先在本类里找方法, 如果找不到, 就调用

    //2.没有找到方法, 就去父类里找, 如果在父类没有找到, 就依次向上, 去父类的父类中找,直到找到,并调用

//    Man *atm = [[Man alloc] initWithName:@"aoteman奥特曼" age:45 gender:@"nan" color:@"红褐色"];

    

    //创建一个Bike

    //继承于NSObject

    //实例变量品牌价格(protected)

    //setter, getter方法

    //写自定义初始化方法

    //写便利构造器

    

    //创建一个RoadBike

    //继承于Bike

    //实例变量品牌价格颜色(protected)

    //setter, getter方法

    //写自定义初始化方法

    //写便利构造器


    Bike *bike = [Bike bikeWithType:@"永久" price:5458.15];

    RoadBike *roadBike =[RoadBike roadBikeWithType:@"凤凰"price:4541.154 color:@"红色"];

    

    //面向对象解决思路

    //1.根据问题, 找出问题中出现的对象

    //2.分析对象的特征和行为

    //3.分析对象的继承关系, 把共有的特征和行为写在父类中, 子类只写独有一些特征和行为

    //4.创建类(创建的顺序:先父类, 后子类)

    //5.特征写成类的实例变量(考虑实例变量的可见度), 行为写成方法(考虑在哪里使用, 写成公开的,还是私有的?)

    //6.如果外部访问实例变量, 写settergetter方法; 如果想要为实例变量赋初值, 重新init方法; 如果想要快速的生成对象, 写自定义初始化方法或者便利构造器

    //7.根据创建好的类,生成对应的对象, 解决对应的问题

二:

Person.h文件里:

#import

@interface Person : NSObject{

    NSString *name;

    NSInteger age;

    NSString *gender;

   }

- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString*)aGender;

- (void)setName:(NSString *)aName;

- (NSString *)name;

- (void)setAge:(NSInteger)aAge;

- (NSInteger)age;

- (void)setGender:(NSString *)aGender;

- (NSString *)gender;

- (void)sayHi;

@end

三:Person.m文件里:

#import "Person.h"

@implementation Person

- (id)init{

    //C语言中用NULL

    //OC中用nil

    

    //使用super调用父类的init方法, 并使用self接受方法的返回值

    self = [super init];

    //判断self是否为nil, 如果是nil, 说明父类初始化失败; 如果不为nil, 父类初始化成功, 接着再对奔雷的实例变量赋值

    if (self != nil) {

      //本类的实例变量赋值(每个类只需要关心自己的实例变量的赋值,从父类继承过来的实例变量有父类自己管理)

        name = @"账单";

        gender = @"男";

        age = 18;

    }

        return self;

    }

- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString*)aGender{

    if (self = [super init]) {

        

    

    name = aName;

    age = aAge;

    gender = aGender;

    }

    return self;

}

- (void)setName:(NSString *)aName{

    name = aName;

   }

- (NSString *)name{

    return name;

}

- (void)setAge:(NSInteger)aAge{

    age = aAge;

}

- (NSInteger)age{

    return age;

}

- (void)setGender:(NSString *)aGender{

    gender = aGender;

}

- (NSString *)gender{

    return gender;

   }

- (void)sayHi{

    NSLog(@"我叫%@,性别%@,今年%ld岁了, 咱们交个朋友吧!嘿嘿!",name, gender,age);

}

@end

四:​man.h文件中:

//修改继承关系步骤

//1.引入父类头文件

//2.@interface的冒号后面写上父类名



#import "Person.h"


@interface Man : Person{

    NSString *color;

    

    

    

    

}

- (void)work;

- (void)setColor:(NSString *)aColor;

- (NSString *)color;


- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString *)aGender color:(NSString *)aColor;

@end

五:Man.m文件中

#import "Man.h"

@implementation Man

//版本1: 初始化时, 给自身和父类的实例变量赋值

//缺点: 初始化时, 需要关心父类的实例变量

//- (id)init{

//    name = @"账单";

//    gender = @"男";

//    age = 18;

//    color = @"紫色";

//    return self;

//}

//

//版本2:初始化时, 给本类里的实例变量赋值

//缺点: 只给本类的实例变量赋值, 从父类继承过来的实例变量没有赋值

//- (id)init{

//    color = @"紫色";

//    return self;

//}

//版本3:初始化时, 每个类先通过[super init]调用父类的方法, 并对从父类继承过来的实例变量赋值,再对自身类中的实例变量赋值

//- (id)init{

//    [super init];

//    color = @"紫色";

//    return self;

//}

//版本4: 使用self接受[super init]的返回值, 然后判断self是否为nil, 如果不为 nil, 说明父类初始化成功, 再对自身的实例变量赋值

//- (id)init {

//    //self

//    //1.在实例方法中, 代表对象, man

//    //2.在类方法中, 代表类, Man

//    self = [super init];

//    if (self != nil) {

//        color = @"紫色";

//    }

//    return self;

//}

//版本5:

- (id)init{

    if (self = [super init]) {

        color = @"紫色";

    }

    returnself;

}

//- (id)init{

//    self = [super init];

//    if (self) {

//        color = @"紫色";

//    }

//    return self;

//}

//1.

- (id)initWithName:(NSString *)aName age:(NSInteger)aAge gender:(NSString*)aGender color:(NSString *)aColor{

//    if (self =[super init]) {

//        color = aColor;

//        name = aName;

//        age = aAge;

//        gender = aGender;

//    }

//    return self;

//}

   self = [super initWithName:aName age:aAge gender:aGender];

   

   if(self){

    

    

    color = aColor;

}

returnself;

}

- (void)work{

    NSLog(@"%@在上班",name);

}

//当父类的方法, 不能满足子类的需求时, 子类可以重写父类的方法

//在子类中重新写父类的方法, 不需要写声明

//重写父类的方法

//1. 完全重写

//2. 在父类方法实现的基础上, 补充功能, 使用super调用父类方法

- (void)sayHi{

    //super: 编译指令, 用于调用父类的方法

    [super sayHi];

    NSLog(@"我最喜欢的颜色是%@", color);

}

- (void)setColor:(NSString *)aColor{

    color = aColor;

}

- (NSString *)color{

    return color;

}

@end

六:BIke.h文件中​#import

@interface Bike : NSObject{

    

    NSString *type;

    CGFloat price;

}

- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice;

+ (id)bikeWithType:(NSString *)aType price:(CGFloat)aPrice;

- (void)setType:(NSString *)aType;

- (NSString *)type;

- (void)setPrice:(CGFloat)aPrice;

- (CGFloat)price;

@end

 

七:Bike.m文件中:

#import "Bike.h"

@implementation Bike

- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice{

    self = [super init];

    if (self) {

        type = aType;

        price = aPrice;

    }

    returnself;

}

+ (id)bikeWithType:(NSString *)aType price:(CGFloat)aPrice{

    return [[Bike alloc] initWithType:aType price:aPrice];

}

- (void)setType:(NSString *)aType{

    type = aType;

}

- (NSString *)type{

    return type;

}

- (void)setPrice:(CGFloat)aPrice{

    price = aPrice;

    

}

- (CGFloat)price{

    return price;

}

@end

八:RoadBile.h文件里:

#import "Bike.h"

@interface RoadBike : Bike{

    

    NSString *color;

    

}

- (void)setColor:(NSString *)aColor;

- (NSString *)color;

- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString *)aColor;

+ (id)roadBikeWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString*)aColor;

@end

九:RoadBile.m文件里:

#import "RoadBike.h"

@implementation RoadBike

- (void)setColor:(NSString *)aColor{

    color = aColor;

    

    

}

- (NSString *)color{

    return color;

}

- (id)initWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString *)aColor{

    self = [super initWithType:aType price:aPrice];

    if (self) {

        color = aColor;

    }

    returnself;

}

+ (id)roadBikeWithType:(NSString *)aType price:(CGFloat)aPrice color:(NSString*)aColor{

    return [[RoadBike alloc] initWithType:aType price:aPrice color:aColor];

}

@end

十:本讲结束..

0 0
原创粉丝点击