OC学习笔记之OC类的设计练习实战

 

    
一、题目
      为了练习OC类的设计与使用,小桥除了做老师的题目外也随便写了个题目来写在这篇笔记中: 

/*-------------------------------------

 * 小桥想的一个类设计小题目

 

 1.设计一个教师类

    1> 属性

     * 名字

     * 教师ID

     * 教的专业(0C语言 1OC 2C++)

    2> 方法

     * 属性对应的setget方法

     * 设计一个对象方法或类方法判断一个学生是不是这个老师教的

 2.设计一个学生类

    1> 属性

     * 名字

     * 学生ID

     * 所学专业

    2> 方法

     * 属性对应的setget方法

     * 设计一个对象方法或类方法判断老师是不是教学生专业的


-------------------------------------*/
    很简单的两个类拿来练手,教师类和学生类。 

    
二、多文件联编
      在做题目之前,小桥还是先说下多文件联合编译,因为下面会用到。在实际开发中,大量的代码当然不会都只放在一个文件里,而按照功能的不同,放在不同的文件里,这样不但方便查找代码,对维护和修改也很容易。比如,我们用一个文件写一个特定的类,一个文件写功能函数,还有一个文件写main函数,在编译的时候,同时编译这些文件,生成的目标文件再链接成一个可执行文件。
         

三、开始做题先设计基类
     小桥这里先在文件夹下面touch一个文件,名字为:01-person.h 这个文件是person基类的声明头文件,里面就写person类的声明部分。代码如下:

// 01-person.h person类的声明

/*--教师和学生有相同属性,而且都是人,这里就用继承关系--*/


#import <Foundation/Foundation.h>


// 先设计他们的基类 Person


@interface Person : NSObject

{

    NSString *_name;//名字

    NSString *_personID;// ID

}


// namesetget方法

- (void)setName:(NSString *)name;

- (NSString *)name;


// ID号的setget方法

- (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


// namesetget方法

- (void)setName:(NSString *)name

{

    _name = name;

}

- (NSString *)name

{

   return _name;

}


// ID号的setget方法

- (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;//教师所教的专业

}


// professionsetget方法

- (void)setProfession:(unsigned)profession;

- (unsigned)profession;


// 判断学生是不是这个老师教的方法

- (bool)isTeachingThisStudent:(Student *)student;


@end 
   

// 02-teacher.m teacher类的实现


#import "02-teacher.h"



@implementation Teacher


// professionsetget方法

- (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;//所学的专业

}


// professionsetget方法

- (void)setProfession:(unsigned)profession;

- (unsigned)profession;


// 判断老师是不是教学生的这个专业

- (bool)isLearningWithTeacher:(Teacher *)teacher;



@end        


// 03-student.m student类的实现


#import "03-student.h"



@implementation Student


// professionsetget方法

- (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,表示老师教的专业不是学生学的专业。说明类的设计达到目的。


    好了,练习就写到这里。


 



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值