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

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


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


类名: 学生

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

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


我们来详细分析一下:

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);
    }
}

@end

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;
}</span>






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

posted @ 2015-01-14 15:22  背着吉他去流浪  阅读(240)  评论(0编辑  收藏  举报