Objective-c:封装、继承与多态
2015-11-13 00:07
393 查看
面向对象的三个基本特征是:封装、继承、多态。
封装的意义在于保护和防止代码(数据)被我们无意中破坏。在面向对象程序设计中,数据被看作是一个中心的元素并且和使用它的函数结合得很密切,从而保护它不被其他的函数意外地修改。
封装提供了一个有效的途径来保护数据不被意外地破坏,相比我们将数据(用域来实现)在程序中定义为公有的(public),我们将它们(fields)定义为私有的(private),这在很多方面会更好。私有的数据可以用两种方式来间接地控制:第一种,我们使用传统的存、取方法;第二种,我们用属性(property)。
使用属性不仅可以控制存取数据的合法性,同时也提供了“读写”、”只读“、”只写“灵活的操作方法。
访问修饰符有:@private、@protected、@public三种。当private、public、protected单纯的作为一个类中的成员权限设置时:private:只能由该类中的函数,不能被任何其他访问,该类的对象也不能访问。protected:可以被该类中的函数、子类的函数,但不能被该类的对象访问。public:可以被该类中的函数、子类的函数、也可以由该类的对象访问。OC中默认的成员属性是@protected,也就是说明了为什么对象不能直接访问那些没有定义属性的变量了。属性是类对外的接口。
通过继承可以拥有父类的全部方法和属性,比如我们可以把一个可变对象当做不可变对象使用,反之则不行;
一般情况下,继承NSObject类。
Objective-C中一个类可以继承另一个类;
子类可以直接“拥有”父类中所有允许子类继承的成员和方法;
子类可以改变父类中已有的方法,执行不同的代码实现。
教师类
从上面的
子类拥有父类的特性,因此只需将
学生类
教师类
上述示例中,
子类可以重写父类的方法,多态就是允许方法重名,参数或返回值可以是父类型传入或返回。
教师类
可以直接调用本类或父类的方法。(方法重名时会直接调用本类的方法)。
只能用来调用父类的方法。(类中方法名与父类完全相同时,如果想要调用父类的方法,只能使用super,例如init方法)。
封装
简介
封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被成为抽象数据类型。封装的意义在于保护和防止代码(数据)被我们无意中破坏。在面向对象程序设计中,数据被看作是一个中心的元素并且和使用它的函数结合得很密切,从而保护它不被其他的函数意外地修改。
封装提供了一个有效的途径来保护数据不被意外地破坏,相比我们将数据(用域来实现)在程序中定义为公有的(public),我们将它们(fields)定义为私有的(private),这在很多方面会更好。私有的数据可以用两种方式来间接地控制:第一种,我们使用传统的存、取方法;第二种,我们用属性(property)。
使用属性不仅可以控制存取数据的合法性,同时也提供了“读写”、”只读“、”只写“灵活的操作方法。
访问修饰符有:@private、@protected、@public三种。当private、public、protected单纯的作为一个类中的成员权限设置时:private:只能由该类中的函数,不能被任何其他访问,该类的对象也不能访问。protected:可以被该类中的函数、子类的函数,但不能被该类的对象访问。public:可以被该类中的函数、子类的函数、也可以由该类的对象访问。OC中默认的成员属性是@protected,也就是说明了为什么对象不能直接访问那些没有定义属性的变量了。属性是类对外的接口。
继承
简介
什么是继承?一个类可以从现有的类中派生出来,这个过程称为继承。新类称为子类,而原始的被继承的类称为父类,有时候父类也会有自己的父类。继承主要实现重用代码,节省开发时间,便于类的扩展。OC中只支持单继承的方式。NSObject是所有类的基类。语法
@interface 类名:父类名
注意
继承是面向对象编程的重要语法,OC是单继承;通过继承可以拥有父类的全部方法和属性,比如我们可以把一个可变对象当做不可变对象使用,反之则不行;
一般情况下,继承NSObject类。
继承特点
使用继承可以实现代码的复用,减少代码冗余;Objective-C中一个类可以继承另一个类;
子类可以直接“拥有”父类中所有允许子类继承的成员和方法;
子类可以改变父类中已有的方法,执行不同的代码实现。
继承结构及相关术语
示例
学生类#import <Foundation/Foundation.h> @interface Student : NSObject { NSInteger _age; NSString *_name; NSString *_code; } @end
教师类
#import <Foundation/Foundation.h> @interface Teacher : NSObject { NSInteger _age; NSString *_name; NSString *_code; NSString *_address; } @end
从上面的
Student类与
Teacher类中可以看出,两个类中都有
_name、
_code、
_age变量,为了提高代码效率,减少冗余,复用代码,可利用继承对上述代码做修改,先创建一个
Person类,如下:
#import <Foundation/Foundation.h> @interface Person : NSObject { NSInteger _age; NSString *_name; NSString *_code; } @end
子类拥有父类的特性,因此只需将
Student类以及
Teacher类继承于
Person类即可,如果有其他特性,则单独定义,如下:
学生类
#import <Foundation/Foundation.h> @interface Student : Person { } @end
教师类
#import <Foundation/Foundation.h> @interface Teacher : Person { NSString *_address; } @end
上述示例中,
Teacher类 与
Student类为
Person类的子类,
Teacher类与
Student类拥有
_name、
_code、
_age变量,为继承所得。
多态
定义
在面向对象语言中,接口的多种不同的实现方式即为多态。换句话说,不同对象对同一消息的不同响应。子类可以重写父类的方法,多态就是允许方法重名,参数或返回值可以是父类型传入或返回。
示例
学生类@interface Student: NSObject - (void)sayHello; @end
@implementation Student - (void)sayHello{ NSLog(@”Hello, I'm a student!”); } @end
教师类
@interface Teacher: NSObject - (void)sayHello; @end
@implementation Teacher - (void)sayHello{ NSLog(@”Hello, I'm a teacher!”); } @end
关键字
self 关键字
在类的方法中替代自身,或者说替代调方法的角色。(实例方法中为调方法的对象,类方法中为类本身)。可以直接调用本类或父类的方法。(方法重名时会直接调用本类的方法)。
super 关键字
在类的方法中替代父类。只能用来调用父类的方法。(类中方法名与父类完全相同时,如果想要调用父类的方法,只能使用super,例如init方法)。
- (instancetype)init { self = [super init]; if (self) { } return self; }
相关文章推荐
- PostgreSQL教程(三):表的继承和分区表详解
- C#与.net高级编程 C#的多态介绍
- C#中面向对象编程机制之多态学习笔记
- Lua面向对象之类和继承浅析
- 浅析Ruby中继承和消息的相关知识
- asp下查询xml的实现代码
- SQL语句的各个关键字的解析过程详细总结
- C#中的多态深入理解
- C# 的关键字详细介绍
- C# 参考之访问关键字:base、this
- C#中多态、重载、重写区别分析
- .net(c#)中的new关键字详细介绍
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- C#基础语法:Base关键字学习笔记
- 深入分析C++中几个最不常用的关键字
- 详谈signed 关键字
- 探讨register关键字在c语言和c++中的差异
- C++实现不能被继承的类实例分析
- C++的static关键字及变量存储位置总结