黑马程序员技术交流社区
标题: 关于不同类的方法与方法之间调用的问题 [打印本页]
作者: 侯金龙 时间: 2014-4-15 11:02
标题: 关于不同类的方法与方法之间调用的问题
本帖最后由 侯金龙 于 2014-4-15 17:00 编辑
#import
typedef enum {
SexMan,
SexWoman
} Sex;
typedef struct {
int year;
int month;
int day;
}Date;
ttypedef enum{
ColorBlack,
ColorRed,
ColorGreen,
}Color;
@interface Dog : NSObject //狗类
{
@public;
double weight; // 体重
Color curColor; //毛色
}
-(void) eat;
-(void) run;
@end
@implementation Dog
-(void) eat
{
// 每吃一次,体重就加1 、
weight +=1;
NSLog (@"狗吃完这次后的体重是%f".weight );
}
-(void) run
{
weight -= 1;
NSLog (@"狗跑完这次后的体重是%f".weight );
}
@end
@interface Student : NSObject
{
Sex sex; // 性别
Date birthday; //生日
double weight;//体重(kg)
Coler favColor;//最喜欢的颜色
char *name; //什么数据类型都可以
//重点:狗
Dog *dog;
}
-(void) eat;
-(void) run;
-(void)print;
- (void)weidog;
- (void)liudog;
@end
@implementation Student
-(void) eat
{
// 每吃一次,体重就加1 、
weight +=1;
NSLog (@"吃完这次后的体重是%f".weight );
}
-(void) run
{
weight -= 1;
NSLog (@"跑完这次后的体重是%f".weight );
}
-(void)print
{
NSlog(@"性别=%d,喜欢的颜色=% d,姓名=%s.生日=%d-%d-%d",sex,favColor,name,birthday.
year,birthday.month,birthday.day);
}
- (void)weidog;
{
//让狗吃东西(调用狗eat 方法)
[dog eat]
}
- (void)liudog;
{
//让狗跑起来(调用狗的run方法)
[dog run];
}
@end
int main()
{
Student *s = [Student new ];
Dog *d = [Dog new];
d->curColor = ColorGreen;
d->weight = 20;
s->dog = d;
[s liudog];
[s weidog];
return 0;
}
void test( )
{
Student *s = [Student new ];
s->weight = 50;
// 性别
s->sex = SexMan;
// 生日
//s->birthday = {2011,9,10}; 错误写法
Date d = {2011,9.10};
s->birthday = d;
s->name = "jack"
// 喜欢的颜色
s->favColor = ColorBlavk;
[s print];
}
Student 的- (void)weidog;- (void)liudog;为什么可以调用-(void) eat;-(void) run;的方法,是不同类之间的方法就是可以互相调用,还是因为别的
作者: 于清扬 时间: 2014-4-15 11:21
[dog run]; [dog eat];是狗类的对象方法,你用狗这个类的对象当然可以调用。建议你看下面向对象的思想,在这个例子中,要狗跑或吃,只需要调用狗的方法就可以。
作者: 程序猿-2014 时间: 2014-4-15 11:52
- @interface Student : NSObject
- {
- Sex sex; // 性别
- Date birthday; //生日
- double weight;//体重(kg)
- Coler favColor;//最喜欢的颜色
- char *name; //什么数据类型都可以
- //重点:狗
- Dog *dog;
- }
- -(void) eat;
- -(void) run;
- -(void)print;
- - (void)weidog;
- - (void)liudog;
- @end
复制代码
想调用首先得有关系啊 你看你这一段代码 狗和学生是组合关系 也就是学生拥有狗对吧 既然狗都是学生的 那狗的方法 学生为什么不能调用呢? 其实面向对象的思想就和我们平时想问题的思想差不多
作者: stone24 时间: 2014-4-15 12:00
面向对象的思想,Student 有狗这个成员变量,根据你上述代码,创建一条狗,并让Student对象s,拥有这条狗d,
当s调用自己的liudog方法时,就方法中的[dog run];这里的dog就s所拥有的这条狗d,就是调用d的run方法,
实现狗跑起来。不是你说s能直接d方法,程序一种设计。
作者: 李烨 时间: 2014-4-15 12:04
先看一下狗这个对象,狗类中有eat(),run() 方法
但是在人类中,Dog *dog;是Person的一个成员变量,Person可以访问他的成员变量(包括成员变量的变量和方法),所以Person可以掉用run()eat()方法,这是一个组合的问题。
作者: 流氓划过夜空 时间: 2014-4-15 13:17
楼主没弄清楚调用关系吧! 首先你要明白什么是对象方法, oc类中以 ‘-’定义的方法是对象方法,对象方法的调用只能是类创建的对象才能调用。
你所谓的:Student 的- (void)weidog;- (void)liudog;为什么可以调用-(void) eat;-(void) run;的方法 并不是什么weidog()方法调用 eat()方法 ,而是在weidog()的实现中,让成员变量dog 调用对象dog的eat()方法 ,
不知道我说的够不够清楚
意思就是 是你的dog对象调用的- (void)eat等方法,不是方法调用方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |