前面我们已经讲解完了一些基础知识, 注意事项, 还有一些简单的例子, 那么今天我们来设计一个属于我们自己的类, 要怎么做才设计的合理呢? 下面我们来看看~~
首先我们得知道要做什么, 比如我要设计一个学生的类, 那么要如何设计呢?
类名: 学生
属性: 名字, 性别, 体重, 身高, 生日
行为(方法): 跑步, 吃东西
我们来详细分析一下:
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>
好了, 这次我们就到这里, 下次我们继续~~~