3、类和对象

3、类和对象


Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_name;
    NSInteger _age; 
}

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

- (void)setAge:(NSInteger)age;
- (NSInteger)age;

- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age;

- (void)sayHi;

// 声明便利构造器,方法名以当前的类名开头
+ (instancetype)personWithName:(NSString *)name
                           age:(NSInteger)age;

@end

Person.m

#import "Person.h"

@implementation Person 

- (void)setName:(NSString *)name
{
    _name = name;
}
- (NSString *)name 
{
    return _name;
}

- (void)setAge:(NSInteger)age
{
    _age = age;
}
- (NSInteger)age
{
    return _age;
}

- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age
{
    _name = name;
    _age = age;

    return self;
}

- (void)sayHi
{
    NSLog(@"name = %@  age = %ld", _name, _age);
}

+ (instancetype)personWithName:(NSString *)name
                           age:(NSInteger)age
{

    // 使用给定的内容创建对象
    Person *person = [[Person alloc] initWithName:name age:age];

    // 返回对象
    return person;  // or  return [[Person alloc] initWithName:name age:age];

}

@end

Student.h

#import "Person.h"

@interface Student : Person
{
    NSInteger _num;
}

- (void)setNum:(NSInteger)num; 
- (NSInteger)num;

// 声明初始化方法
- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age
                         num:(NSInteger)num;

+ (instancetype)studentWithName:(NSString *)name
                            age:(NSInteger)age
                            num:(NSInteger)num;

@end

Student.m

#import "Student.h"

@implementation Student

- (void)setNum:(NSInteger)num
{
    _num = num;
}
- (NSInteger)num
{
    return _num; 
}

- (void)sayHi
{
    // super是编译器指令,作用:给super发送消息,相当于使用从父类继承过来的方法
    // self代表访问当前方法的对象
    [super sayHi];
    NSLog(@"num = %ld", _num);
    // [self sayHi];  产生递归,运行一段时间后会崩

}

- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age
                         num:(NSInteger)num
{
    // 1.使用从父类继承过来的方法,给从父类继承过来的实例变量赋值
    self = [super initWithName:name age:age];

    // 2.判断对象是否初始化成功,然后才是给自己的实例变量赋值
    if (self) {     // if (self != nil) 与 if (self) 作用相同
        _num = num;
    }

    // 3.返回初始化完成的对象
    return self;

}

+ (instancetype)studentWithName:(NSString *)name
                            age:(NSInteger)age
                            num:(NSInteger)num
{
    Student *student = [[Student alloc] initWithName:name age:age num:num];

    return student;
}

@end

CollegeStu.h

#import "Student.h"

@interface CollegeStu : Student
{
    NSString *_major;
    NSString *_academy;
}

- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age
                         num:(NSInteger)num
                       major:(NSString *)major
                     academy:(NSString *)academy;

+ (instancetype)collegeStuWithName:(NSString *)name
                               age:(NSInteger)age
                               num:(NSInteger)num
                             major:(NSString *)major
                           academy:(NSString *)academy;

@end

CollegeStu.m

#import "CollegeStu.h"

@implementation CollegeStu

- (instancetype)initWithName:(NSString *)name
                         age:(NSInteger)age
                         num:(NSInteger)num
                       major:(NSString *)major
                     academy:(NSString *)academy
{
    self = [super initWithName:name age:age num:num];

    if (self) {
        _major = major;
        _academy = academy;
    }

    return self;
}

- (void)sayHi
{
    NSLog(@"num:%ld name:%@ age:%ld major:%@ academy:%@", _num, _name, _age, _major, _academy);
}

+ (instancetype)collegeStuWithName:(NSString *)name
                               age:(NSInteger)age
                               num:(NSInteger)num
                             major:(NSString *)major
                           academy:(NSString *)academy
{
    CollegeStu *collegeStu = [[CollegeStu alloc] initWithName:name age:age num:num major:major academy:academy];

    return collegeStu;
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "CollegeStu.h"

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

        // 创建子类Student对象
        /*
        Student *stu = [[Student alloc] initWithName:@"马小桃" age:18];

        [stu sayHi];
        [stu setName:@"小桃"];
        [stu sayHi];

//        Person *p = [Person alloc] initWithName:<#(NSString *)#> age:<#(NSInteger)#>

        [stu setNum:1001];
        [stu sayHi];
        */

        // 2.使用Student自己的初始化方法,创建对象
        Student *stu2 = [[Student alloc] initWithName:@"小桃" age:18 num:1003];

        [stu2 sayHi];

        CollegeStu *stu3 = [[CollegeStu alloc] initWithName:@"小桃" age:19 num:1004 major:@"日语" academy:@"外院"];

        [stu3 sayHi];

        Person *p3 = [Person personWithName:@"小桃" age:20];

        [p3 sayHi];

        Student *stu4 = [Student studentWithName:@"小桃" age:17 num:1009];

        [stu4 sayHi];

        CollegeStu *collegeStu = [CollegeStu collegeStuWithName:@"小桃" age:12 num:1001 major:@"英语" academy:@"外院"];

        [collegeStu sayHi];

    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值