黑马程序员技术交流社区

标题: 关于不同类的方法与方法之间调用的问题 [打印本页]

作者: 侯金龙    时间: 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
  1. @interface  Student : NSObject
  2. {
  3.        Sex  sex; // 性别
  4.        Date  birthday; //生日
  5.        double  weight;//体重(kg)
  6.        Coler  favColor;//最喜欢的颜色
  7.        char  *name;   //什么数据类型都可以

  8.        //重点:狗
  9.        Dog *dog;
  10. }
  11. -(void) eat;
  12. -(void) run;
  13. -(void)print;

  14. - (void)weidog;
  15. - (void)liudog;
  16. @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