V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
yjxjn
V2EX  ›  iDev

还是没理解 OC 中组合的概念,如何调用另一个类的成员方法

  •  
  •   yjxjn · 2015-10-19 23:29:10 +08:00 · 1838 次点击
    这是一个创建于 3330 天前的主题,其中的信息可能已经有所发展或是发生改变。

    /*3.设计 3 个类,类之间的关系自拟(比如继承、组合)
    1> 人
    (1)属性
    * 姓名
    * 年龄

    (2)方法
    * 属性相应的 set 和 get 方法
    * 设计一个对象方法同时设置姓名和年龄

    2> 书
    (1)属性
    * 书名
    * 出版社名称
    * 作者(包含姓名和年龄)

    (2)方法
    * 属性相应的 set 和 get 方法

    3> 学生
    * 姓名
    * 年龄
    * 学号
    * 书(随身带着一本书)

    2> 方法
    * 属性相应的 set 和 get 方法
    * 设计一个对象方法-study :输出书名
    */

    import <Foundation/Foundation.h>

    @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
    - (void) setName:(NSString *)name{
    _name = name;
    }

    • (NSString *)name{
      return _name;
      }

    • (void)setAge:(int)age{
      _age = age;
      }

    • (int)age{
      return _age;
      }
      -(void)setName:(NSString *)name andAge:(int)age{
      _name = name;
      _age = age;
      }
      @end

    @interface Book : NSObject
    {
    NSString *_name;
    NSString *_publisher;
    Person *_author;

    }
    -(void)setName:(NSString *)name;
    -(NSString *)name;

    -(void)setPublisher:(NSString *)publisher;
    -(NSString *)publisher;

    -(void)setAuthor:(Person *)author;
    -(Person *)author;
    @end

    @implementation Book
    -(void)setName:(NSString *)name{
    _name = name;
    }
    -(NSString *)name{
    return _name;
    }

    -(void)setPublisher:(NSString *)publisher{
    _publisher = publisher;
    }
    -(NSString *)publisher{
    return _publisher;
    }

    -(void)setAuthor:(Person *)author{
    _author = author;
    }
    -(Person *)author{
    return _author;
    }
    @end

    @interface Student : Person
    {
    int _sn;
    Book *_book;
    }
    -(void)setSN:(int)sn;
    -(int)sn;

    -(void)setBook:(Book *)book;
    -(Book *)book;

    -(void)study;
    @end

    @implementation Student

    -(void)setSN:(int)sn{
    _sn = sn;
    }
    -(int)sn{
    return _sn;
    }

    -(void)setBook:(Book *)book{
    _book = book;
    }
    -(Book *)book{
    return _book;
    }
    -(void)study{
    NSLog(@"现在学习的书是%@",[_book name]);
    }
    @end

    int main(){
    Person *p = [Person new];
    [p setName:@"张三" andAge:20];

    Book *b = [Book new];
    [b setName:@"《空间》"];
    [b setPublisher:@"广西师范大学出版社"];
    
    Student *s = [Student new];
    [s setSN:123456];
    [s setName:@"李二"];
    
    [s study];
    
    
    
    
    NSLog(@"姓名是:%@,年龄是:%d,书名:%@,%@,%d,%@",[p name],[p age],[b name],[b publisher],[s sn],[s name]);
    return 0;
    

    }

    我想打印出这本书的作者是谁。

    还有给我讲一下组合的概念,网上 GOO 了一圈,也还是没理解

    2 条回复    2015-11-05 09:36:52 +08:00
    Rand01ph
        1
    Rand01ph  
       2015-10-20 09:33:02 +08:00
    为啥不用 property ,会自动生成存取方法,这些问题更像是面向对象编程的问题,可以去补补,再来看 OC 。
    horipse
        2
    horipse  
       2015-11-05 09:36:52 +08:00
    我想楼主的意思应该是,如何 NSLog 出 Author 的名字?
    如果不愿意使用 property 直接生成存取方法的话,应该理清各对象中的元素的关系呢.

    就按照题主的想法来吧,假设一个变量是这本书的作者。那么首先初始化 p2(这个变量,Person 类),在 main()中先调用 setAuthor 方法,即可。

    `Person *p2 = [[Person alloc]init];
    [p2 setName:@"example" andAge:"10"];
    [b setAuthor:p2];
    `
    打印出作者是谁,也就是题主想打印出名字?(姑且这么理解),因为 p2 是个 Person 类,它包含的不只有 name,还有 age 信息.
    所以要打印的话
    NSLog(@"The author is %@",b.author.name);

    不知你是否能理解?
    建议题主看看 property 和 synthesize
    如有错误请指正
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2562 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:15 · PVG 13:15 · LAX 21:15 · JFK 00:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.