一、题目
为了练习OC类的设计与使用,小桥除了做老师的题目外也随便写了个题目来写在这篇笔记中:
/*-------------------------------------
* 小桥想的一个类设计小题目
1.设计一个教师类
1> 属性
* 名字
* 教师ID号
* 教的专业(0:C语言 1:OC 2:C++)
2> 方法
* 属性对应的set和get方法
* 设计一个对象方法或类方法判断一个学生是不是这个老师教的
2.设计一个学生类
1> 属性
* 名字
* 学生ID号
* 所学专业
2> 方法
* 属性对应的set和get方法
* 设计一个对象方法或类方法判断老师是不是教学生专业的
-------------------------------------*/
很简单的两个类拿来练手,教师类和学生类。
二、多文件联编
在做题目之前,小桥还是先说下多文件联合编译,因为下面会用到。在实际开发中,大量的代码当然不会都只放在一个文件里,而按照功能的不同,放在不同的文件里,这样不但方便查找代码,对维护和修改也很容易。比如,我们用一个文件写一个特定的类,一个文件写功能函数,还有一个文件写main函数,在编译的时候,同时编译这些文件,生成的目标文件再链接成一个可执行文件。
三、开始做题先设计基类
小桥这里先在文件夹下面touch一个文件,名字为:01-person.h 这个文件是person基类的声明头文件,里面就写person类的声明部分。代码如下:
// 01-person.h person类的声明
/*--教师和学生有相同属性,而且都是人,这里就用继承关系--*/
#import <Foundation/Foundation.h>
// 先设计他们的基类 Person类
@interface Person : NSObject
{
NSString *_name;//名字
NSString *_personID;// ID号
}
// name的set和get方法
- (void)setName:(NSString *)name;
- (NSString *)name;
// ID号的set和get方法
- (void)setPerson:(NSString *)personID;
- (NSString *)personID;
@end
Person类中的两个属性是NSString类型,NSString是OC中提供的一个库类,用来处理字符串,为了熟悉它小桥在这里把它用上。两个属性对应的set和get方法用来对属性赋值和访问,不多说,只是在写法上要注意OC方法的书写,小桥有时会写错,还有成员变量要以下划线打头。
声明写完,小桥继续touch一个文件,名字为:01-person.m 用来写Person类的实现部分。open这个文件后写下如下代码:
// 01-person.m person类的实现
#import "01-person.h"
@implementation Person
// name的set和get方法
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
// ID号的set和get方法
- (void)setPerson:(NSString *)personID
{
_personID = personID;
}
- (NSString *)personID
{
return _personID;
}
@end
这样基类就设计好了,它用教师类和学生类共有的两个属性和相应的set、get方法 。
四、教师类
小桥一次touch两个文件,名字分别为:02-teacher.h 02-teacher.m 和上面的一样分别用来写类的声明和实现,头文件代码如下:
// 02-teacher.h 教师类
#import "01-person.h"
#import <Foundation/Foundation.h>
#import "03-student.h"
//继承person类
@interface Teacher : Person
{
unsigned _profession;//教师所教的专业
}
// profession的set和get方法
- (void)setProfession:(unsigned)profession;
- (unsigned)profession;
// 判断学生是不是这个老师教的方法
- (bool)isTeachingThisStudent:(Student *)student;
@end
// 02-teacher.m teacher类的实现
#import "02-teacher.h"
@implementation Teacher
// profession的set和get方法
- (void)setProfession:(unsigned)profession
{
_profession = profession;
}
- (unsigned)profession
{
return _profession;
}
// 判断学生是不是这个老师教的方法
- (bool)isTeachingThisStudent:(Student *)student
{
return [self profession] == [student profession];
}
@end
在教师类的头文件中,因为要继承Person类,所以要import Person类的头文件。类似地,在对象方法
- (bool)isTeachingThisStudent:(Student *)student中用到了Student类,所以也要import它的头文件。这里说下这个对象方法:
这个方法接受一个Student类型的参数,返回值为布尔型,在方法体中有两个方法调用 [self profession] 和 [student profession],self与this指针相似代表方法调用者本身,这里是得到profession的值相等就返回yes,否则no
五、学生类
同样touch两个文件分别为:03-student.h 和 03-student.m 代码如下:
// 03-student.h 学生类声明
#import "01-person.h"
#import "02-teacher.h"
@interface Student : Person
{
unsigned _profession;//所学的专业
}
// profession的set和get方法
- (void)setProfession:(unsigned)profession;
- (unsigned)profession;
// 判断老师是不是教学生的这个专业
- (bool)isLearningWithTeacher:(Teacher *)teacher;
@end
// 03-student.m student类的实现
#import "03-student.h"
@implementation Student
// profession的set和get方法
- (void)setProfession:(unsigned)profession
{
_profession = profession;
}
- (unsigned)profession
{
return _profession;
}
// 判断老师是不是教学生的这个专业
- (bool)isLearningWithTeacher:(Teacher *)teacher
{
return [self profession] == [teacher profession];
}
@end
和教师类差不多,小桥就不多解释了。
六、测试设计的类
设计好类之后,必须做一下测试,不然不知道类设计得是不是正确的,有没有达到预期目的。
小桥再touch一个文件:main.m 一看就知道是用来写main函数的,代码如下:
//
// main.m
// 类的设计
//
// Created by 葬花桥 on 14-5-4.
// Copyright (c) 2014年 itcast. All rights reserved.
//
#import "01-person.h"
#import "02-teacher.h"
#import "03-student.h"
int main(int argc, constchar * argv[])
{
Teacher *t = [Teacher new];
Student *st = [Student new];
[t setProfession:0];
[st setProfession:1];
bool y = [st isLearningWithTeacher:t];
NSLog(@"%d",y);
return0;
}
为了简单,小桥这里只实例了两个对象,教师一个,学生一个,并且只设置了他们的专业,然后调用学生的判断方法,判断老师是不是教的他的专业。在终端联合编译链接这四个文件:
cc 01-person.m 02-teacher.m 03-student.m main.m -framework Foundation
回车发现有错,一个 expected a type错误,小桥在网上查了很久也没搞清楚这个错误,最后还是黑马论坛的一位仁兄告诉我这是OC中的循环包含错误。读者去上面看看teacher和student类就可以发现他们彼此都import了对方,
teacher.h中 import了student.h student.h中又import了teacher.h 这就是循环包含。只要在两个头文件中把import改成 @class Student; 和 @class Teacher;就行了 。@class只是声明有这个类,以便下面的代码使用这个类合法,让编译通过,至于这个类怎么写不管。OK,编译链接成功,a.ou执行输出0,表示老师教的专业不是学生学的专业。说明类的设计达到目的。 |