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;
}