<A href="http://www.goodprogrammer.org/" target="blank">ios培训</A>------我的objective-c笔记,期待与您交流!
面向对象的特点有三个,即封装、继承和多态。封装主要体现在类中。本文将介绍面向对象的另外两个特点继承。
一·继承
在Objective-C中,一个新类的定义往往都基于另一个类,而这个新类就继承了原来类的所有功能。被继承的类称为父类。继承的类称为子类。通常Objective-C支持单继承和多层继承,不支持多重继承。使用单继承使Objective-C的关系更简单。
1·继承的实现
如下图所示
其中,在继承时“:”是用来实现继承,子类名和父类名的命名要符合标识符的命名规范。在Objective-C中默认的父类名是NSObject。
我们在生活中也会遇到继承这一特性。例如,可食用的物品分为水果、蔬菜、面等。水果中又分为苹果、梨、香蕉等,蔬菜中又分为土豆、白菜、黄瓜等。我们可以将食用性称为父类,水果继承了可食用性,所以将水果作为食用的子类。由于苹果是水果,也可吃,所以将苹果作为水果的子类。
2·实例变量的继承
在父类中声明的实例变量可以在子类中使用,在子类中就不需要再对该变量进行声明。子类继承了父类的实例变量变成了自己类中的实例变量。子类不仅可以继承父类的实例变量,还可以拥有自己特有的实例变量。
其中,当要继承父类中的实例变量时,子类就不需要再定义相同的实例变量了。如果子类要继承父类的话,要在子类的接口文件中,以文件包含的形式将父类的头文件引出。如果没有用文件包含的形式引出父类的话,程序就会出现错误提示信息。
3·方法的继承
方法也可以被继承,父类中定义的方法在子类中也可以直接被访问,不需要在子类中重新定义。这可以使代码量减少。子类不仅可以继承父类的方法,还可以有自己独特的方法。
二·访问限定符
在声明实例变量的时候,Objective-C提供了访问限定符对实例变量的作用域进行控制。因此我们可以正确控制实例变量的使用范围。Objective-C提供的访问限定符有三种,分别为@public、@protected和@private。
1·@public
用@public修饰的实例变量的作用域是不受限制的。这意味着被修饰的实例变量不仅可以在所属的类和子类中都可以被直接访问,而且还可以被其他类定义的方法直接访问。由于它对面向对象有影响,所以不建议使用。@public修饰的数据成员称为共用的数据成员。@public修饰实例变量是在实例变量前面进行修饰。
定义方式为@public 数据类型 变量名
2.@protect
用@protected修饰的实例变量,只可以在所属的类及其任何子类定义的方法中被直接访问。用@protected修饰的数据成员也称为保护数据成员。
定义方式为@public 数据类型 变量名
3·@protect
用@private修饰的实例变量,只可以在所属类的方法中调用,不能被子类中定义的方法调用。被@private修饰的数据成员又称为私有数据成员
定义方式为@protect 数据类型 变量名
4·总结
1).相同之处
@public、@protected和@private这3个访问限定符都是数据成员的修饰符。它们都要写在被修饰数据成员的前面。
2)·不同之处
@public、@protected和@private这3个访问限定符的不同之处主要是被修饰数据成员的访问范围。下图详细说明。
三·方法重写
子类可以继承父类的方法,而不需要重新编写方法。但是在有的时候子类可能不想全部继承父类的方法,而是想作一些修改,这就需要在原有方法的基础上对方法进行重写。方法重写也叫方法覆盖。
1·方法重写的形式
方法重写就是改写在***.m文件中的方法
当子类和父类中的某一方法具有相同的方法名、返回值类型、参数,那么子类中的方法就覆盖了父类中的方法。
2·super
当父类和子类中的方法完全一样的时候,就会出现将父类中的方法覆盖。如果想要看父类的方法,就要使用supper。supper关键字代表父类,使用它可以访问被子类所隐藏或者重写的方法。
[super 方法名]
四·方法重载
方法重载是在类中可以创建多个具有相同名字的方法,在这些同名的方法中,应该有不同的参数和不同的定义。在调用的时候可以通过传递的参数格式和参数的数据类型来决定具体使用的是什么方法。重载不是子类对父类同名方法的重新定义,而是类对自身已有的同名方法的重新定义。
五·多态
多态是面向对象编程的另一个重要的特点。简单来说,所谓多态是指相同的消息给予不同的对象会引发不同的动作。例如,默认定义了一个动物类,而由动物这个类继承出鸡和狗这两个子类。它们对其父类即动物传达的消息有不同的响应,父类有“叫”这一动作,而鸡和狗的叫声是不一样的,则称之为多态。
六·动态类型和动态绑定
1·动态类型id
id类型是一个独特的数据类型。它可以转换为任何数据类型
定义一个id类型的变量:id 变量名;
返回id类型方法:(id)方法名;
2·动态绑定
动态绑定是指在执行期间(非编译器)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。动态绑定的实现是离不开动态类型id的。