A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kfz0507 中级黑马   /  2017-6-15 23:17  /  1337 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、题目
      为了练习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,表示老师教的专业不是学生学的专业。说明类的设计达到目的。

评分

参与人数 1黑马币 +5 收起 理由
zhao543 + 5 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马