Objective_C_03

15/12/8
//  Objective_C_03

#import <Foundation/Foundation.h>
#import "Preson.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
    Student *stu = [[Student alloc] initWithName:@"yutongxue" age:18 sex:@"w"];
    [stu sayHi];
    /*
     OC中继承的特点
     1.继承中上一层是父类,下一层是子类(父类和子类是相对的)
     2.所有的类的最根本的父类是NSObject:类的祖宗
     3.继承具有传递性
     4.核心:子类能继承父类的所有特征和行为(private修饰的除外)
     继承用处:
     1.增强代码的复用性,减少代码开发的时间
     2.实现代码的层级分离
     */
    /*
     初始化方法:
     作用:为实例变量赋值,保证值的正确性
     要求:
初始化方法在这个对象的整个生命周期中,只使用一次(可以多次调用,但不建议这么去做,这也是为什么开辟空间和初始化通常写在一起,防止重复调用)
    生命周期:从创建到释放
    初始化流程:
     在初始化之前会根据对象的实例变量的个数和类型申请足够大的内存,初始化的时候,就是根据每个实例变量的类型再分配到内存中重新分配内存,初始化对象。
     不完整初始化方法的问题:
     1.初始化的时候,需要将父类,祖父类。。。的所有的实例变量都要初始化,容易漏,也容易出错。
     2.并不能一定完全知道所有的祖先有哪些实例变量。
     完全体的理解思路:
     初始化方法就是对实例变量进行初始化
     来自父类的实例变量就是调用父类的方法对他们进行初始化
     自己新增的实例变量就直接进行初始化
     
    初始化方法注意事项:
     1.方法的类型是“-”
     2.方法的返回值是“instancetype”(“id”)
     3.以init开头,并且符合驼峰命名法(建议用With)
     4.可以带参数,参数的个数没有限制
     5.完整的写法,必须调用父类的初始化方法
    */
    //如果子类不满意父类方法的实现,可以重写父类的方法(找离得最近的方法)
    Student *stu1 = [[Student alloc] initWithName:@"lusy" age:20 sex:@"w"];
    [stu1 sayHi];
    [stu sayHi];
    
    Student *stu2 = [[Student alloc] initWithName:@"lubi" age:21 sex:@"w" school:@"lanou" score:98.5];
    [stu2 sayHi];
    NSLog(@"姓名:%@ 年龄:%ld 性别:%@ 学校:%@ 分数:%0.2f",[stu2 getName],[stu2 getAge],[stu2 getSex],[stu2 getSchool],[stu2 getScore]);
    [stu2 sayAllMessage];
    
//    super是编译器指令,并非对象
    /*
     便利构造器
     精神是:牺牲小我,完成大我
     在调用的时候,方便快捷,内存管理省心,另一方面,就是在类里要多写一些代码
     做法是:在方法中直接完成alloc和init
     */
    Student *stu3 = [Student studentWithName:@"wang" age:21 sex:@"n" school:@"lanou" score:85.5];
    [stu3 sayAllMessage];
    return 0;
}
//  Preson.h
//  Objective_C_03
//

#import <Foundation/Foundation.h>

@interface Preson : NSObject{
    NSString *_name;
    NSInteger _age;
    NSString *_sex;
}
- (void)sayHi;
- (id)initWithName : (NSString *)name
                age : (NSInteger)age
                sex : (NSString *)sex;
- (void)setName : (NSString *)name;
- (void)setAge : (NSInteger)age;
- (void)setSex : (NSString *)sex;
- (NSString *)getName;
- (NSInteger)getAge;
- (NSString *)getSex;
@end

//
//  Preson.m
//  Objective_C_03
#import "Preson.h"
@implementation Preson
- (void)sayHi{
    NSLog(@"I am %@",_name);
}
- (id)initWithName : (NSString *)name
                age : (NSInteger)age
                sex : (NSString *)sex{
    _name = name;
    _age = age;
    _sex = sex;
    return self;
}
- (void)setName : (NSString *)name{
    _name = name;
}
- (void)setAge : (NSInteger)age{
    _age = age;
}
- (void)setSex : (NSString *)sex{
    _sex = sex;
}
- (NSString *)getName{
    return _name;
}
- (NSInteger)getAge{
    return _age;
}
- (NSString *)getSex{
    return _sex;
}
@end

//
//  Student.h
//  Objective_C_03
//

#import "Preson.h"

@interface Student : Preson
{
    NSString *_school;
    CGFloat _score;
}
- (void)sayHi;
- (id)initWithName : (NSString *)name
               age : (NSInteger)age
               sex : (NSString *)sex
            school : (NSString *)school
             score : (CGFloat)score;
//便利构造器
+ (id)studentWithName : (NSString *)name
                  age : (NSInteger)age
                  sex : (NSString *)sex
               school : (NSString *)school
                score : (CGFloat)score;
- (void)setSchool : (NSString *)school;
- (void)setScore : (CGFloat)score;
- (NSString *)getSchool;
- (CGFloat)getScore;
- (void)sayAllMessage;
@end

//  Student.m
//  Objective_C_03

#import "Student.h"

@implementation Student
- (id)initWithName : (NSString *)name
               age : (NSInteger)age
               sex : (NSString *)sex
            school : (NSString *)school
             score : (CGFloat)score{
    self = [super initWithName:name age:age sex:sex];
    if (self) {
        _school = school;
        _score = score;
    }
    return self;
}
- (void)setSchool : (NSString *)school{
    _school = school;
}
- (void)setScore : (CGFloat)score{
    _score = score;
}
- (NSString *)getSchool{
    return _school;
}
- (CGFloat)getScore{
    return _score;
}
- (void)sayHi{
    [super sayHi];//调用父类的实现
    NSLog(@"I am %@, I am %ld years old, my sex is %@",_name,_age,_sex);
}
- (void)sayAllMessage{
    NSLog(@"姓名:%@ 年龄:%ld 性别:%@ 学校:%@ 分数:%0.2f",_name,_age,_sex,_school,_score);
}

+ (id)studentWithName : (NSString *)name
                  age : (NSInteger)age
                  sex : (NSString *)sex
               school : (NSString *)school
                score : (CGFloat)score{
    Student *student = [[Student alloc] initWithName:name age:age sex:sex school:school score:score];
    return student;
}
@end

posted @ 2015-12-19 14:35  DH_Fantasy  阅读(70)  评论(0)    收藏  举报