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

2015-10-19 23:29:10 +08:00
 yjxjn
/*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 了一圈,也还是没理解
1815 次点击
所在节点    iDev
2 条回复
Rand01ph
2015-10-20 09:33:02 +08:00
为啥不用 property ,会自动生成存取方法,这些问题更像是面向对象编程的问题,可以去补补,再来看 OC 。
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
如有错误请指正

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/229381

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX