OC1

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


总结:封装,继承,组合,多态。

以面向对象的思想来解决问题(对象与对象之间的逻辑关系);同时要掌握 怎么对不同类的对象的属性值赋值以及调用这些对象的方法






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值