简述类的三个基本特征

来源:互联网 发布:河南打车软件 编辑:程序博客网 时间:2024/05/01 03:02

    学过语言的都知道,类的三个基本特征是封装,继承,多态。但是如何深刻理解这三个基本特征并且明白需要使用他们,貌似不是那么容易,下面本人将结合自己的学习所得展开一下自己对类三个基本特征的理解。(以下内容以oc语言进行详解)
   首先需要明白类的含义,类是具有相同属性(特征)和行为的对象的集合,是抽象的,而类所正对的对象却是具体的。举个例子:人类,每个人都有自己的名字,年龄,身高,国籍等共有的属性,每个人都会吃饭,跑步,工作等等,这只是抽象的含义,具体要某个人,比如乔布斯(姓名:乔布斯,年龄56,国籍:美国。。。),比尔盖茨等等。
  @interface Human:NSObject//定义人类这个类
{
//人类所共有的特征,包括名字,年龄,国籍,身高等;
nsstring * _name;
int _age;
nsstring * nation;
float _tall;

//人类共有的行为
-(void)eat;
-(void)run;
-(void)wok;

理解了类的含义之后,我们将引入类的第一个特征:封装;
从字面含义理解封装就是将一个东西包装起来,比如我们日常去超市买了一盒月饼,我们只知道是一盒月饼,但是却不知道月饼是如何制造的,月饼的成色,配料等等,这些我们都不知道的,我们只知道拿来吃就行了,同理,封装在类的定义中就是我们只关心如何去访问变量,而不会看到他如何实现的。
在oc中将用属性和方法这一概念,完成对成员变量和实例方法的封装;
例子:  @interface Human:NSObject//定义人类这个类
{
//人类所共有的特征,包括名字,年龄,国籍,身高等;
nsstring * _name;
int _age;
nsstring * nation;
float _tall;

//属性声明
@property (nonatomic,retain)nsstring * name;
@property (nonatomic,assign)int age;
@property (nonatomic,retain)nsstring *nation;
@property (nonatomic,assign)float tall;
//人类共有的行为
-(void)eat;
-(void)run;
-(void)wok;

@implementation:
//合成属性
@synthesize name=_name;
@synthesize age=_age;
@synthesize nation=_nation;
@synthesize tall=_tall;
//具体化实例方法
-(void)eat
{
nslog(@"i eat an apple.");
}

appdelegate.m:
//具体到某个对象时,这里是乔布斯
Human *jobs=nil;
//内存分配空间,并完成初始化;
jobs=[[Human alloc]init];
//此时的变量是封装号的属性,能够直接访问,并且赋值
jobs.name=@"jobs";
jobs.age=56;
jobs.tall=185.5;
jobs.nation=@"america";
//执行已经封装的eat方法
[jobs eat];
 
从上面的例子可以看出,封装具有以下特性:1、隐藏关键部位 ,做到保密效果 2、简化程序,提高工作效率 3、提高程序的安全性,因为在oc中直接访问成员变量是不安全的做法;

   人,生之于父母,因而我们继承了父母的很多特征,包括外貌、性格、身体,当然我们不可能和父母是一模一样的,我们具有自己独有的特征和行为。父母就是父类(超类),而我们自己就是子类;
   那什么时候需要用到继承呢,当类是两个或者两个以上并且两个类具有很多相同的特征和行为时,为了简化代码量,我们将使用继承这一说。下面将以猫类和狗类作为两个类,来描述继承这一概念;
猫:
属性:姓名,年龄,毛色  
行为 :捉老鼠,洗澡,玩耍,进食
狗:
属性: 
姓名,年龄,毛色  
行为 :看门,洗澡,玩耍,进食
由猫和狗可以看到,两者具有相同的属性和相同的行为(洗澡、进食、玩耍),此时我们可以引入继承,让他们共同继承一个父类(父母),并且使他们具有其父母的所有属性和行为特征;
引入动物类(animal)
父类:
@interface Animal:nsobject
{
//声明两者共同具有的成员变量
nsstring *_name;
int _age;
nsstring *_color;

//声明共同的行为
-(void)tub;//洗澡
-(void)play;
-(void)eat; 

狗类:
//继承于动物类
@interface Dog:Animal 
{
//由于前面在父类中已经做了声明,这里已经不需要定义,因为子类将直接继承弗雷中所有的成员变量,如果父类中没有,这里还要做出没有的那个变量的声明

//声明狗独有的行为
-(void)guardoor;//看门
猫类和狗类是类似的;  这样我们就完成了类的继承;

从上面的例子可以看到,我们在父类中声明了一个play方法,那么狗和猫都将继承这个父类方法,但是狗有狗的玩法,比如赛跑,猫有猫的玩法,比如捉老鼠。这个就是类的多态性,即对于同一种实例的不同的状态(反应,处理方式)。
 oc中将通过下列两种方法实现多态。
方法一:通过重写父类中的方法实现多态;
方法二:虚函数; 

方法一:
以play方法为例:
父类:-(void)  play
{
nslog(@“i am happy”);

狗类:-(void) play
{
nslog(@" i pay through running!");

在子类方法重写之后,将会覆盖父类已被具体化方法,程序执行子类方法; 

方法二
仍然以play方法为例,但是引入玩过之后洗把澡
首先引入虚函数这一概念,在oc中我们把不做任何定义的方法称为虚函数
例如:-(void)tub
{
}
父类:
//定义了一个虚函数
-(void)tub
{}
-(void)play 
{
nslog(@"i am happy");
//调用自己
[self tub];


狗类:
-(void)tub
{
nslog(@"i jump into a lake to wash myself!");


运行结果:i am happy;
                 
i jump into a lake to wash myself;



原创粉丝点击