#import <Foundation/Foundation.h>
/***** 人类 书类 学生类 ****/
/*
1.学生是人 所以学生与人 有继承关系---继承
2.学生带着一本书 所以书是组成学生的一部分---组合
3.书有作者(人) 所以人是组成书的一部分---组合
1.类和组合都具有传递性(其实都是因为:指针)
*继承是用‘:’,继承父类的成员变量以及方法
*组合是用类A在类B中定义一个指针变量,传递的参数(实际上是对象)也应是A类型的,可以在B类中 用B的A类型成员变量(即A类的一个对象)调用A类的方法
因为:
A *a = [B new]; //B类中有一个eat方法
[a eat]; //调用方法时,会动态的检测对象的真实类型,所以调用的是 B 的 eat 方法
*/
/**** 人类声明 *****/
@interface Person : NSObject
{
NSString *_name; //姓名
int _age; //年龄
}
- (void)setName:(NSString *)name;
- (NSString *)name;
- (void)setAge:(int)age;
- (int)age;
- (void)setName:(NSString *)name andAge:(int)age;
@end
/**** 人类实现 *****/
@implementation Person
//姓名的set/get方法实现
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
//年龄的set/get方法实现
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
//即设置姓名又设置的年龄的set方法实现
- (void)setName:(NSString *)name andAge:(int)age
{
_name = name;
_age = age;
//也可以用self调用类的set方法
}
@end
/**** 书类声明 *****/
@interface Book : NSObject
{
Person *_author; //作者
NSString *_publisher; //出版社
NSString *_bookname; //书名
}
- (void)setAuthor:(Person *)author;
- (Person *)author;
- (void)setPublisher:(NSString *)publisher;
- (NSString *)publisher;
- (void)setBookName:(NSString *)bookname;
- (NSString *)bookName;
@end
/**** 书类实现 *****/
@implementation Book
//书的作者的set/get方法实现
- (void)setAuthor:(Person *)author
{
_author = author;
}
- (Person *)author
{
return _author;
}
//书的出版社的set/get方法实现
- (void)setPublisher:(NSString *)publisher
{
_publisher = publisher;
}
- (NSString *)publisher
{
return _publisher;
}
//书名的set/get方法实现
- (void)setBookName:(NSString *)bookname
{
_bookname = bookname;
}
- (NSString *)bookName
{
return _bookname;
}
@end
/**** 学生类声明 *****/
@interface Student : Person
{
int _no; //学号
Book *_book; //学生带的书
//Book里面用了Person类,所以不用在这里用Person了
}
- (void)setNo:(int)no;
- (int)no;
- (void)setBook:(Book *)book;
- (Book *)book;
- (void)study;
@end
/**** 学生类实现 *****/
@implementation Student
//学生学号的set/get方法实现
- (void)setNo:(int)no
{
_no = no;
}
- (int)no
{
return _no;
}
//学生的书的set/get方法实现
- (void)setBook:(Book *)book
{
_book = book;
}
- (Book *)book
{
return _book;
}
//学生的study方法的实现
- (void)study
{
NSLog(@"现在学习的书是:%@", [_book bookName]);
/*
A *a = [B new]; //B类中有一个eat方法
[a eat]; //调用方法时,会动态的检测对象的真实类型,所以调用的是 B 的 eat 方法
*/
}
@end
int main()
{
//创建一个学生对象 (此时对象的属性值仍是 NULL)
Student *stu = [Student new];
//创建一个书对象 (同上)
Book *b = [Book new];
[b setBookName:@"黄焖鸡小锅饭烹饪指南"]; //用书类中的对象方法set书名
//把这个书对象 ‘赋给’ 这个学生对象;因为stu的成员变量是被保护的,所以stu->_book = b不行,用set方法给学生对象set一个书对象
[stu setBook:b];
//这样,‘学生对象’中就有了一个‘书对象’,调用学生的study方法,就会输出这个学生正在学习什么书
[stu study];
return 0;
}
总结:封装,继承,组合,多态。
以面向对象的思想来解决问题(对象与对象之间的逻辑关系);同时要掌握 怎么对不同类的对象的属性值赋值以及调用这些对象的方法