Objective - C基础: 第一天 - 10.如何合理的设计一个类

来源:互联网 发布:中秋大数据 编辑:程序博客网 时间:2024/06/05 04:19

前面我们已经讲解完了一些基础知识, 注意事项, 还有一些简单的例子, 那么今天我们来设计一个属于我们自己的类, 要怎么做才设计的合理呢? 下面我们来看看~~


首先我们得知道要做什么, 比如我要设计一个学生的类, 那么要如何设计呢?


类名: 学生

属性: 名字, 性别, 体重, 身高, 生日

行为(方法): 跑步, 吃东西


我们来详细分析一下:

1. 我们知道了学生的属性有五个, 分别是姓名, 性别, 生日, 体重, 身高

如果按照我们一般的思维来设计的话, 没有经验的人应该会这么写:

@interface Student : NSObject{    @public    int year;   //年    int month;  //月    int day;    //日    char *name;  //名字    double weight;  //体重    int height;  //身高    char *sexMan;   //性别男    char *sexWomen; //性别女}@end


这样子写的坏处, 一旦创建的对象多了, 那不就要写的累死人了吗? 为了方便, 我们应该把一些固定的东西抽出来做成一个枚举, 把一些相同的类型抽出来做成一个结构体:

typedef enum{    SexMan,    SexWomen}Sex;typedef struct{    int year;    int month;    int day;}Date;@interface Student : NSObject{    @public    char *name;  //名字    double weight;  //体重    int height;  //身高    Date birthday;  //生日    Sex sex;    //性别}- (void)eat;- (void)run;@end

而且还可以顺便把下面的两个方法给声明, 知道了这些信息之后, 我们就可以继续往下:

@implementation Student- (void)eat{    weight += 1;    NSLog(@"吃完一次之后的体重是:%.2f/kg", weight);}- (void)run{    weight -= 1;    NSLog(@"运动完一次之后的体重是:%.2f/kg", weight);}@end


方法我们也实现好了, 那么主要就看main()函数里面要怎么去给成员变量赋值了:

int main(){    Student *xiaoming = [Student new];    xiaoming->name = "xiaoming";    xiaoming->sex = SexMan;    xiaoming->height = 165;    xiaoming->weight = 55.5;        Date d = {1999, 1, 9};    xiaoming->birthday = d;        [xiaoming print];        return 0;}


main()函数里面也搞定了之后, 如果我们需要知道学生的信息, 那么我们可以再写一个方法把学生的信息打印出来:

- (void)print{    NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-%d-%d.", name, sex, weight, height, birthday.year, birthday.month, birthday.day);}

输出的结果:

2015-01-14 16:01:13.067 a.out[9033:937651] 这名学生叫xiaoming, 他的性别是0, 体重是55.50/kg, 身高是165/cm, 生日是1999-1-9.



但是, 还有一个问题, 我们这里需要再考虑一个事情, 有些生日的日期是XXXX-XX-X这样子的格式, 如果有这样子的需求, 我们必须得去解决, 该怎么解决呢? 下面我们来看看:

- (void)print{    if (birthday.month < 10) {        NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-0%d-%d.", name, sex, weight, height, birthday.year, birthday.month, birthday.day);    }    else    {        NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-%d-%d.", name, sex, weight, height, birthday.year, birthday.month, birthday.day);    }}

输出的结果:

2015-01-14 16:02:59.959 a.out[9039:938372] 这名学生叫xiaoming, 他的性别是0, 体重是55.50/kg, 身高是165/cm, 生日是1999-01-9.




看到这里或许有人会疑问, 为什么性别是0呢???  让我们回忆一下枚举类型里面存储的是什么东西, 没错~~~枚举类型里面存的是整型, 默认是从0开始~~~在这里性别男是0, 所以打印出来的结果就是0.




补充一些知识点:

在我们实际开发中, 枚举类型最好是以枚举名开头, 比如:

typedef enum{    SexMan,    SexWomen}Sex;

这样子方便团队合作的时候别人知道对应的是什么枚举类型.


还有在main()函数里面的结构体赋值, 我之前讲过, 创建好对象的时候不可以再给结构体赋值, 只有再初始化的时候才可以给结构体赋值, 这里我举几个简单的方法解决这个问题:

1.    Date d = {1999, 1, 9};    xiaoming->birthday = d;2.        xiaoming->birthday.year = 1999;    xiaoming->birthday.month = 1;    xiaoming->birthday.day = 9;3.        Date d = xiaoming->birthday;    d.year = 1999;    d.month = 1;    d.day = 9;    xiaoming->birthday = d;

在这里, 哪个简单就使用哪个, 所以推荐使用第一个~~其他两个方法了解就好了~~


那么最终的效果就是:

<span style="font-size:12px;">#import <Foundation/Foundation.h>typedef enum{    SexMan,    SexWomen}Sex;typedef struct{    int year;    int month;    int day;}Date;@interface Student : NSObject{    @public    char *name;  //名字    double weight;  //体重    int height;  //身高    Date birthday;  //生日    Sex sex;    //性别}- (void)eat;- (void)run;@end@implementation Student- (void)eat{    weight += 1;    NSLog(@"吃完一次之后的体重是:%.2f/kg", weight);}- (void)run{    weight -= 1;    NSLog(@"运动完一次之后的体重是:%.2f/kg", weight);}- (void)print{    if (birthday.month < 10) {        NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-0%d-%d", name, sex, weight, height, birthday.year, birthday.month, birthday.day);    }    else    {        NSLog(@"这名学生叫%s, 他的性别是%d, 体重是%.2f/kg, 身高是%d/cm, 生日是%d-%d-%d", name, sex, weight, height, birthday.year, birthday.month, birthday.day);    }}@endint main(){    Student *xiaoming = [Student new];    xiaoming->name = "xiaoming";    xiaoming->sex = SexMan;    xiaoming->height = 165;    xiaoming->weight = 55.5;        Date d = {1999, 1, 9};    xiaoming->birthday = d;        [xiaoming print];        return 0;}</span>






好了, 这次我们就到这里,  下次我们继续~~~

0 0
原创粉丝点击