// Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSString *_gender;
int _age;
}
//setter
- (void)setName: (NSString *)name;
- (void)setGender: (NSString *)gender;
- (void)setAge: (int)age;
//getter
-(NSString *)name;
-(NSString *)gender;
-(int)age;
// 打印所有的实例变量
- (void)printInformation;
#pragma mark 自定义初始化方法
// 自定义初始化方法
- (id)initWithName: (NSString *)name // ***出错点:泛型!!!-(id)
Gender: (NSString *)gender
Age: (int)age;
@end
// Person.m
#import "Person.h"
@implementation Person
//setter/getter
- (void)setName: (NSString *)name{
_name = name;
}
- (void)setGender: (NSString *)gender{
_gender = gender;
}
- (void)setAge: (int)age{
_age = age;
}
-(NSString *)name{
return _name;
}
-(NSString *)gender{
return _gender;
}
-(int)age{
return _age;
}
// 打印所有的实例变量
- (void)printInformation{
NSLog(@"姓名:%@,性别:%@, 年龄:%d", _name, _gender, _age);
}
#pragma mark 自定义初始化,赋值
// 自定义初始化,赋值
- (id)initWithName: (NSString *)name
Gender: (NSString *)gender
Age: (int)age{
_name = name;
_gender = gender;
_age = age;
return self;
}
@end
// Student.h
#import "Person.h"
@interface Student : Person
{
NSString *_schoolName;
NSString *_ID;
}
setter/getter
- (void)setSchoolName: (NSString *)schoolName;
- (void)setID: (NSString *)ID;
- (NSString *)schoolName;
- (NSString *)ID;
- (void)printInformation;
@end
// Student.m
#import "Student.h" // 不引入头文件,则无法完成继承。即:继承就得引入头文件。
@implementation Student
#pragma mark 重写父类的方法
// 重写父类的方法
- (void)printInformation{
NSLog(@"客官,你叫:%@,你的性别:%@,年龄:%d, 学校:%@ ,ID:%@", _name, _gender, _age, _schoolName, _ID);
}
- (void)setSchoolName: (NSString *)schoolName{
_schoolName = schoolName;
}
- (void)setID: (NSString *)ID{
_ID = ID;
}
- (NSString *)schoolName
{
return _schoolName;
}
- (NSString *)ID{
return _ID;
}
#pragma mark description方法
// description方法是由系统提供的一种描述对象特征的一个实例方法,默认在打印一个对象时,会调用该方法,返回类名+对象地址。我们可以重写这个方法,将若干实例变量拼接为一个字符串返回,这样就可以打印我们想要的信息。
- (NSString *) description{
// 使用字符串类,创建出一个字符串对象,然后使用格式初始化方法来将参数拼接进这个字符串对象
NSString *string = [[NSString alloc] initWithFormat:@"嘿,你的名字是:%@,你的性别:%@,年龄:%d, 学校:%@ ,ID:%@", _name, _gender, _age, _schoolName, _ID ];
return string;
}
@end
// main.m
#import <Foundation/Foundation.h>
#import "Person.h"// <>引入系统提供的头文件 ""引入自己创建的头文件
#import "Student.h"
int main(int argc, const char * argv[]) {
#pragma mark -继承
/*
* 继承的特性:
* 1、单继承:继承是单向的(不能相互继承)、继承也是单点的(子类只能有一个父类)
* 2、传递性:子类具备父类的所有实例变量和方法,并且能通过父类继承到父父类的实例变量和方法。
* 用代码实现继承:
在类的.h文件中,@interface后的冒号表示继承关系,冒号左边的类继承自冒号右边的类(没有特殊说明,一般是NSObject,所有类最终都继承自该类)
*/
#pragma mark --创建一个Person类的 对象person1
Person *person1 = [[Person alloc] initWithName:@"张学友" Gender:@"男" Age:38];
[person1 printInformation];
#pragma mark --创建一个继承自Person类的Student类 的对象student1
// 继承自Person类的子类,可以拥有父类的所有非私有的实例变量和方法
Student *student1 = [[Student alloc] initWithName:@"爱新觉罗玄烨" Gender:@"男" Age:77];
// 对象调用setter方法修改
[student1 setSchoolName:@"西安帝国建筑科技大学"];
[student1 setID:@"110"];
// 如果子类重写了父类的方法(见studet.m),那么将会执行重写的方法.
// [student1 printInformation];
#pragma mark --调用对象的description方法
// 使用NSlog直接打印一个对象时,会调用对象的description方法。
NSLog(@"%@", student1);
#pragma mark 总结
/*
今天学习了继承 的特性:
* 继承的特性:
* 1、单继承:继承是单向的(不能相互继承)、继承也是单点的(子类只能有一个父类)
* 2、传递性:子类具备父类的所有实例变量和方法,并且能通过父类继承到父父类的实例变量和方法。
* 用代码实现继承:
在类的.h文件中,@interface后的冒号表示继承关系,冒号左边的类继承自冒号右边的类(没有特殊说明,一般是NSObject,所有类最终都继承自该类)
以及description方法的使用
// description方法是由系统提供的一种描述对象特征的一个实例方法,默认在打印一个对象时,会调用该方法,返回“类名+对象地址”。我们可以重写这个方法,将若干实例变量拼接为一个字符串返回,这样就可以打印我们想要的信息。
- (NSString *) description{
// 使用字符串类,创建出一个字符串对象,然后使用格式初始化方法来将参数拼接进这个字符串对象
NSString *string = [[NSString alloc] initWithFormat:@"嘿,你的名字是:%@,你的性别:%@,年龄:%d, 学校:%@ ,ID:%@", _name, _gender, _age, _schoolName, _ID ];
return string;
}
*/
return 0;
}