------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
/*
1.设计一个 “狗” 类
1)属性 颜色、速度、性别、体重
2)行为 吃:每吃一次,一种增加0.5,输出吃完后的体重
叫:输出所有属性
跑:每跑一次体重减0.5,输出速度和跑完后的体重
比较颜色:跟别的狗比较颜色,如果一样返回YES,否则返回NO
比较速度:跟别的狗比较速度,返回速度差
2.结合前面的“狗”类,设计一个“人”类
1)属性 姓名、狗(养了一条狗)
2)行为 喂狗:每喂一次,狗就会执行“吃”的行为
遛狗:每遛一次,狗就会执行“跑”的行为
*/
#import <Foundation/Foundation.h>
typedef enum{Male,Female} Sex; //枚举性别,并重命名
typedef enum{kBlack,kWhite,kYellow} Color; //枚举颜色,并重命名
#pragma mark Dog类的声明
@interface Dog : NSObject
{
@public
Color _color; //狗的颜色
int _speed; //狗的速度
Sex _sex; //狗的性别
float _weight; //狗的体重
}
-(void)eat:(NSString *) foodName; //狗吃食物
-(void)shout; //狗叫
-(void)run; //狗跑
-(BOOL)isCompareColor:(Dog *) dog; //比较狗的颜色
-(int)CompareSpeed:(Dog *) dog; //比较狗的速度
@end
#pragma mark Person类的声明
@interface Person : NSObject
{
@public
NSString *_name; //人的姓名
Dog * _dog; //人养的狗
}
-(void)feedDog:(NSString *) foodName; //人喂狗食物
-(void)walkDog; //人遛狗
@end
#pragma mark Dog类的实现
@implementation Dog
-(void)eat:(NSString *) foodName{
_weight+=0.5f;
NSLog(@"狗吃了%@,吃后体重是%.2f",foodName,_weight);
}
-(void)shout{
NSLog(@"颜色:%d,体重:%.2f,性别:%d,速度:%d",_color,_weight,_sex,_speed);
}
-(void)run{
_weight-=0.5f;
NSLog(@"跑步的速度为%d,跑步后的体重是%.2f",_speed,_weight);
}
-(BOOL)isCompareColor:(Dog *) dog{ //返回值是YES和NO,所以返回类型用BOOL
if(_color == dog->_color){
return YES;
}else{
return NO;
}
}
-(int)CompareSpeed:(Dog *) dog{
return _speed-dog->_speed;
}
@end
#pragma mark Person类的实现
@implementation Person
-(void)feedDog:(NSString *)foodName{
[_dog eat:foodName];
}
-(void)walkDog{
[_dog run];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建第一只狗的对象
Dog *d1=[Dog new];
d1->_speed=80;
d1->_weight=20;
d1->_sex=Male;
d1->_color=kWhite;
//创建第二只狗的对象
Dog *d2=[Dog new];
d2->_speed=50;
d2->_weight=25;
d2->_sex=Female;
d2->_color=kWhite;
[d1 eat:@"骨头"];
[d1 shout];
[d1 run];
BOOL isSameColor=[d1 isCompareColor:d2]; //定义一个BOOL类型的变量接收返回值
NSLog(@"isSameColor = %d",isSameColor);
int cha=[d1 CompareSpeed:d2]; //定义一个整型变量接收返回值
NSLog(@"速度差是%d",cha);
NSLog(@"-------------");
//创建一个 人 的对象
Person *p = [Person new];
p->_dog = d1;
/* 让人属性中的狗的地址指向第一只狗的属性的地址,如果没有这句话就无法将人这个类中狗的属性与第一只狗的属性做关联
当执行p feedDog 时,先找p的地址,找到对应_isa,通过_isa指针找到feedDog的方法,feedDog取了_dog的值,_dog又找到了d1的_isa指针,通过_isa指针找到Dog中的eat方法。
*/
[p feedDog:@"牛肉"];
[p walkDog];
}
return 0;
}