黑马程序员_OC学习之封装,继承,多态

来源:互联网 发布:windows route trace 编辑:程序博客网 时间:2024/05/04 10:38

------- IOS培训、android培训、期待与您交流! ----------
面向对的三大特征就是,我们经常提到的 封装、继承、多态。

1.封装:

         隐藏属性、方法或实现细节的过程,不去关心你的方法是怎么实现的,只关心你能做什么。并且,封装的意义在于

保护或者防止代码(数据)被我们无意中破坏。

通常情况下我们可能会定义一个类,比如student ,这是一个学生类

他会有一些成员变量,例如:

           int age;   / /  学生姓名

          int number //学生编号

那么也许我们在之后,创建了一个student对象,

student  *s=[student new]

我们就就可以给这个s对象的age赋值操作,在实际情况下,我们也学会设置

s.age=10;

s.age=20;

但是如果程序或者人为,将

s.age=-20;

上面这就感觉很奇怪了,在现实中这显然是没有意思的,也是违背实际情况的。那么这是我们就需要用到封装了。

将 age  设为一个 @private,这样,这个成员变量就不能在累的外部访问了。

想要更改age的值,我们就提供一个

set方法------》

如果向下面这样写:

// set方法的实现

-   (viod)setAge : (int)newAge

{        //对传进来的参数进行过滤

         if(newAge <= 0)

{

         newAge = 1;

}

         age = newAge;

}

 

这样经过setAge方法判断过滤,就可以实现正确安全的操作了,这就是一个简单的封装案例。

 

2.继承

基于一个已存在的类构造一个新类。继承已存在的类就是复用这些类的方法和属性,在此基础上,还可以在新类中添加一些新的方法和属性.

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。

OC中集成的句法就是 :   

例如:

@interface  person : NSObject

{

         NSString *name;

         int  age;

}

@end

注:NSObject是所有类的基类

我们还可以定义一个student 来继承person,如下

@interface  student : person

{

         int  number; //学号

}

@end

 

经过上面的定义,虽然student类中没有name 以及  age的定义,但是但你创建一个student对象时,它是具有age以及name这两个属性的。

从上面就知道:

继承的好处

1.       重复的代码可以只写一边。

2.       子类可以拥有父类中所有的成员变量和方法。

 

3.多态

多态性(polymorphism)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的实例给父类类型的指针。

 假如我们有一个Animal类,而现在又有两个类DogCat都继承了Animal

  我们知道Dog以及Cat两个类,都有实现“叫”的这个功能,但是两种类的对象的叫的具体方法肯定是不一样的。那个这是,我们想写一个方法,实现当我们传一个Dog的对象,就执行Dog类定义的方法。传一个Cat的对象,也执行自己的方法。那么怎么办:

这里就用到了多态:例如

Animal  *a = [Dog  new];  //这是一个Dog对象

Animal  *b = [Cat  new]; //这是一个Cat对象

 

这就是允许将子类类型的实例给父类类型的指针。

然后我们分别调用

[a Say];//这是会执行Dog类定义的具体方法

[b Say];//这是会执行Cat类定义的具体方法

 

 

多态的实现可以采用以下几种方式:
    (1)使用 vod * (万能指针)来实现“编译时多态”。
    (2)使用函数指针来实现“运行时多态”。
    (3)使用型如

struct struct_name{

        char temp[0]; //或者char *temp;
          };
这种形式。

 举例:

void HandleMsg(unsinged int id, void *p)
{
    Msg1 *p1;
    Msg2 *p2;

    switch(id)
    {
    case key1:
        p1 = (Msg1*)p;
        //do something
        break;
    case key2:
        p2 = (Msg2*)p;
        //do something
        break;
    default:
        break;
    }
}


 

 

 

 

 

 ------- IOS培训、android培训、期待与您交流! ----------

0 0
原创粉丝点击