天天看点

Objective-C基础(面向对象--下--三大特性--继承、多态)

一、继承

       1. 为什么要使用继承呢?

            1)先看一个例子:

                  声明一个Person类

#import <Foundation/Foundation.h>
@interface Person : NSObject
{
	int _age; // 年龄
	int _height; // 身高
	NSString *_name; // 姓名
}
// 声明set方法和get方法
- (void)setAge:(int)age;
- (int)age;
- (void)setHeight:(int)height;
- (int)height;
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
@implementation Person
//set方法和get方法的实现
- (void)setAge:(int)age
{
	_age = age;
}
- (int)age
{
	return _age;
}
- (void)setHeight:(int)height
{
	_height = height;
}
- (int)height
{
	return _height;
}
- (void)setName:(NSString *)name
{
	_name = name;
}
- (NSString *)name
{
	return _name;
}
@end

           

                定义一个学生类:

@interface Student : Person
{
	int _no; // 学号
}

- (void)setNo:(int)no;
- (int)no;
@end

@implementation Student
- (void)setNo:(int)no
{
	_no = no;	
}
- (int)no
{
	return _no;
}
@end
           

             在Person类中定义了_age, _height, _name 三个成员变量,而Student类中定义了_no成员变量。但实际上在Student类中也有_age, _height, _name成员变量,这是因为Student继承了Person类,那么Student就拥有了父类Person的全部功能。那么这个继承是怎么实现的呢?

       在C++和Java中继承都是通过关键字来实现,而Objective-C中继承以 “ :”标记 。如Person类中  开头

      @interface Person :NSObject

      @end

      这行程序声明了Person继承了NSObject类,NSObject类是最基本的类,也就是说所有的类都继承这个类,同理第二段程序中Student类继承了Person类,从而Student就有了Person类的成员变量和方法。通过继承这一功能就给程序员编写程序带来很多好处:

       -->  不改变原来模型的基础上,拓充方法

       -->  建立了类与类之间的联系

       -->  减少了工作量,使程序简介不重复累赘

       2)继承的使用场合:

         -->  当定义一个类时,这个类要使用另一个类的大部分属性和方法,一般用继承。

       3)继承的注意事项:

         -->  父类必须声明在子类前面

         -->  子类不能拥有和父类相同的成员变量

         -->  调用某个方法时,优先去当前的类中找,如果找不到,去父类中找

          坏处:耦合性太强

        4) 继承和组合

             -->  继承:  xxx  是  xxx

             -->  组合:  xxx  拥有  xxx 

       2.  super关键字

            super的作用:

            -->  直接调用父类中的某个方法

            -->  super处在对象方法中,那么就会调用父类的对象方法

            -->  super处在类方法中,那么就会调用父类的类方法。

        3.重写:

           当子类对父类的某一方法的功能需求不满意时,可以对该方法的功能重新定义,这种方式就是重写。重写时不得改变该方法在父类中的声明,方法名不变,只需 在当前类中改变方法的功能。重写方法后,当程序在调用该方法时直接调用子类的方法,不再调用父类中对应的该方法。

二、多态

        多态是指某一类事物的多种形态,多态以继承为前提,没有继承,如果没有继承,多态就无从谈起。

int main()
{
    Animal *aa = [Dog new]; // 父类指针指向子类对象
    Dog *dd = (Dog *)aa;   // 将父类型强转为子类型
    return 0;
}
           

               该段程序就是多态的运用(Animal类和Dog类的定义略),Dog类继承了父类,同过[Dog new]来创建了一个Dog对象,然后定义以个Animal类型的指针 *aa指向了该Dog对象,也就是所谓的父类指针指向子类对象,这就是多态。

          试想一下:为什么要引入多态这个概念呢?

          如果当函数中或者方法中使用的是父类的类型,这时多态的特性就体现了。

         但是多态有局限性,它不能直接调用子类特有的方法。需要调用子类特有的方法时,必须要强制转换成子类类型变量。