关于类的设计,初学者有很多东西需要注意的,除了代码的编写之外,还有很多类的设计方面的东西需要顾及,所以关于这一块,就拿一个小程序来体会,这样会更加生动清晰。
我们要写一个学生类,
这个类的成员(属性)有:性别,生日,体重,最喜欢颜色,还有一条狗
他包含的方法有:吃饭,跑步,遛狗,喂狗
写之前,可以想一下,关于性别,只有两个选项,男和女,我们可以定义枚举类型;同样的还有颜色;那关于生日,有年月日三个变量,为了减少工量,我们可以定义成结构体变量,至于那条狗,我们可以给狗再写一个类,然后给狗属性(体重,毛色),给狗方法(吃,跑)。这样设计的话,就会比较合理,简洁,流畅,易读性强。还便于我们日后维护。具体实现如下:
typedef enum //枚举变量定义性别
{
SexMan,
SexWomen,
}Sex;
typedef enum //枚举变量定义喜欢的颜色
{
ColorBlue,
ColorRed,
ColorBlack,
}Color;
typedef struct //结构体定义日期
{
int year;
int month;
int day;
}Date;
@interface Dog : NSObject //声明狗的类
{
@public
int weight;
Color furCol;
}
-(void)eat; //声明狗的方法
-(void)run;
@end
@implementation Dog //实现狗的方法 吃和走
-(void)eat
{
weight += 1;
NSLog(@""狗吃完这次后的体重是%f", weight);
}
- (void)run
{
weight -= 1;
NSLog(@"狗跑完这次后的体重是%f", weight);
}
@end
/*
学生
成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色,吃、跑)
方法:吃、跑步、遛狗(让狗跑)、喂狗(让狗吃)
*/
@interface Student : NSObject
{
@public
Sex sex; // 性别
Date birthday; // 生日
double weight; // 体重(kg)
Color favColor; // 最喜欢的颜色
char *name;
// 重点:狗
Dog *dog;
}
- (void)eat;
- (void)run;
- (void)print;
- (void)liuDog;
- (void)weiDog;
@end
@implementation Student
- (void)liuDog
{
// 让狗跑起来(调用狗的run方法)
[dog run];
}
- (void)weiDog
{
// 让狗吃东西(调用狗的eat方法)
[dog eat];
}
- (void)print
{
NSLog(@"性别=%d, 喜欢的颜色=%d, 姓名=%s, 生日=%d-%d-%d", sex, favColor, name, birthday.year, birthday.month, birthday.day);
}
- (void)eat
{
// 每吃一次,体重就加1
weight += 1;
//weight = weight + 1;
NSLog(@"学生吃完这次后的体重是%f", weight);
}
- (void)run
{
weight -= 1;
NSLog(@"学生跑完这次后的体重是%f", weight);
}
@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;
// 生日
Date d = {2011, 9, 10};
s->birthday = d;
s->name = "Jack";
/*
s->birthday.year = 2011;
s->birthday.month = 9;
s->birthday.day = 10;
*/
// 喜欢的颜色
s->favColor = ColorBlack;
/*
[s eat];
[s eat];
[s run];
[s run];
*/
[s print];
}