A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 执着的土豆 于 2014-4-29 22:35 编辑

   先上代码,再抛问题,希望高手给予解答。
  • 定义一个Person类 :
     
  1. #import <Foundation/Foundation.h>
  2. @interface Person : NSObject
  3. @property int age; //年龄
  4. @property NSString* name; //姓名
  5. @end
复制代码
2.定义一个book类,并且组合Person类
  1> 一本书
* 书名:《葵花宝典》
* 出版社:绝情谷出版社
* 作者:东方不败、120岁
想初始化时修改默认参数为上述内容,book类的声明与实现如下:
  1. /*---------------------book类的声明--------------*/
  2. #import <Foundation/Foundation.h>
  3. #import "Person.h"
  4. @interface Book : NSObject

  5. @property NSString* bookName;
  6. @property NSString* pub;
  7. @property Person* auther; //book组合Person类
  8. @end
复制代码
  1. /*---------------------book类的实现--------------*/
  2. #import "Book.h"

  3. @implementation Book
  4. -(id)init
  5. {
  6.    if(self=[super init])
  7.    {
  8.       _bookName=@"《葵花宝典》";
  9.       _pub=@"\t绝情谷出版社";
  10.        //能不能在这里初始化修改默认的作者的姓名和年龄
  11.    }
  12.     return self;
  13. }
  14. @end
复制代码
主函数中调用如下:
现在是这么写的,想在主函数中省去给作者和年龄赋值,直接调用过来输出,求教各位有没有办法,如果有,请科普一下,如果没有,能不能告诉一下,为什么不可以。
  1.     //现在是这么写的,想在主函数中省去给作者和年龄赋值,直接调用过来输出,求教各位有没有办法,如果有,请科普一下,如果没有,能不能告诉一下,为什么不可以。
  2.     Person *auth=[Person new];
  3.     auth.name=@"东方不败";
  4.     auth.age=120;
  5.     book.auther=auth;
  6.     NSLog(@"这本书是%@,出版自%@,作者是%@,作者今年%d岁了",book.bookName,book.pub,book.auther.name,book.auther.age);
复制代码



评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

倒序浏览
马凯文 发表于 2014-4-29 21:28
Person类保持你的不变看看是不是这个意思!有问题可以继续问我

哦,这样,我想到过要传进去一个person对象,在重写init方法的时候,还写成过- (id)init:(Person*)person  ,但是不行。    还有一个事情不大确定,是不是组合只能将类的成员变量拿过来用,不能把类的方法也拿过来用么?
回复 使用道具 举报
马凯文 发表于 2014-4-29 21:28
Person类保持你的不变看看是不是这个意思!有问题可以继续问我

刚看完自定义构造方法的视频。 重新构造了一下,也能实现了。   不过你给的思路也很好。  如果再有类继承的话,就不需要修改类名,直接new也可以。  
  1. @implementation Book
  2. -(id)initWithName:(Person *)auther
  3. {
  4.    if(self=[super init])
  5.    {
  6.       _bookName=@"《葵花宝典》";
  7.       _pub=@"\t绝情谷出版社";
  8.        _auther=auther;
  9.        _auther.name=@"东方不败";
  10.        _auther.age=120;
  11.    }
  12.     return self;
  13. }
  14. @end
复制代码

主函数,调用。
  1.     Person *auth=[Person new];
  2.     Book *book=[[Book alloc] initWithName:auth];
  3.     book.auther=auth;
  4.     NSLog(@"这本书是%@,出版自%@,作者是%@,作者今年%d岁了",book.bookName,book.pub,book.auther.name,book.auther.age);
复制代码
回复 使用道具 举报
马凯文 发表于 2014-4-29 23:13
组合可以有类方法,person类可以调用类方法,book的init中[[author class]  alloc]这就是一个调用类方法 ...

嗯,我刚才试出来了,刚开始不能用,是因为没有给对象,指针指向的是空,刚才把对象穿过去,直接_auther.name就可以赋值了。     非常感谢 !!   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马