OC对象的三大特性:封装、继承和 多态

一、封装

封装:隐藏对象的属性和实现细节,仅对外公开接口,控制程序中属性的读和修改的访问级别。

person.h:

1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4 /** 年龄 */
5 @property (nonatomic, assign) int age;
6
7 @end

person.m:

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 #pragma mark - 重写set方法
 6 - (void)setAge:(int)age {
 7     if (age < 0) {
 8         NSLog(@"年龄不能为负数");
 9         return;
10     } else {
11         _age = age;
12         return;
13     }
14 }
15
16 @end

优点:

1. 隐藏内部实现细节,设置访问权限,提高了数据的安全性。

2. 任何出入的数据都要流经接口,通过重写set方法可以起到过滤数据的作用。

二、继承

继承:指一个对象直接使用另一对象的属性和方法。

Person.h:

1 #import <Foundation/Foundation.h>
2
3 @interface Person : NSObject
4 /** 年龄 */
5 @property (nonatomic, assign) int age;
6 /** 吃方法 */
7 - (void)eat;
8
9 @end

Person.m:

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 #pragma mark - 重写set方法
 6 - (void)setAge:(int)age {
 7     if (age < 0) {
 8         NSLog(@"年龄不能为负数");
 9         return;
10     } else {
11         _age = age;
12         return;
13     }
14 }
15
16 #pragma mark - 吃方法实现
17 - (void)eat {
18     NSLog(@"Person 吃饭");
19 }
20
21 @end

GoodPerson.h:

1 #import "Person.h"
2
3 // 继承父类Person
4 @interface GoodPerson : Person
5 /** 姓名 */
6 @property (nonatomic, strong) NSString *name;
7
8 @end

GoodPerson.m:

1 #import "GoodPerson.h"
2
3 @implementation GoodPerson
4
5 - (void)eat {
6     NSLog(@"GoodPerson 吃饭");
7 }
8
9 @end

main.m:

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3 #import "GoodPerson.h"
 4
 5
 6 int main(int argc, const char * argv[]) {
 7     /** 人 */
 8     Person *p = [[Person alloc] init];
 9     p.age = 20;
10     [p eat];
11
12     /** 好人 */
13     GoodPerson *goodP = [[GoodPerson alloc] init];
14     goodP.age = 30;
15     [goodP eat];
16
17     // 好人姓名
18     goodP.name = @"Lkun";
19     NSLog(@"好人name = %@", goodP.name);
20
21
22     return 0;
23 }

编译运行结果:

2016-08-18 17:53:37.484 01-discription[634:455001] Person 吃饭
2016-08-18 17:53:37.485 01-discription[634:455001] GoodPerson 吃饭
2016-08-18 17:53:37.485 01-discription[634:455001] 好人name = Lkun
Program ended with exit code: 0

注解:

1. 大部分类都继承自NSObject父类,所以也都继承了该类的属性和方法。

2. GoodPerson虽继承了父类Person的属性age和方法eat,但却有其独特的方法name,且重写了父类的方法eat。

3. 当子类对象收到方法消息时则逐层查找,找到即执行。如setName方法在GoodPerson父类就可以找到,而setAge类得在Person父类才能找到

优点:抽取重复代码、建立联系

缺点:耦合性强

继承:狗是动物,所以狗继承动物类

组合:学生拥有狗,所以把狗作为学生类的一个属性

三、多态

多态:父类指针指向子类对象,父类类型参数可以接收子类类型参数的传入

Person.h:

1 #import <Foundation/Foundation.h>
2 #import "Animal.h"
3
4 @interface Person : NSObject
5  // 喂食动物的方法
6 - (void)feedAnimal:(Animal *)animal;
7
8 @end

Person.m:

1 #import "Person.h"
2
3 @implementation Person
4
5 - (void)feedAnimal:(Animal *)animal {
6     [animal eat];
7 }
8
9 @end

Animal.h:

1 #import <Foundation/Foundation.h>
2
3 @interface Animal : NSObject
4 /** 吃方法 */
5 - (void)eat;
6
7 @end

Animal.m:

1 #import "Animal.h"
2
3 @implementation Animal
4
5 - (void)eat {
6     NSLog(@"Animal eat");
7 }
8
9 @end

Cat.h:

1 #import "Animal.h"
2
3 @interface Cat : Animal
4
5 @end

Cat.m:

1 #import "Cat.h"
2
3 @implementation Cat
4 #pragma mark - 重写父类的吃方法
5 - (void)eat {
6     NSLog(@"Cat eat");
7 }
8
9 @end

Dog.h:

1 #import "Animal.h"
2
3 @interface Dog : Animal
4
5 @end

Dog.m:

1 #import "Dog.h"
2
3 @implementation Dog
4 #pragma mark - 重写父类吃方法
5 - (void)eat {
6     NSLog(@"Dog eat");
7 }
8
9 @end

main.m:

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3 #import "Animal.h"
 4 #import "Cat.h"
 5 #import "Dog.h"
 6
 7
 8 int main(int argc, const char * argv[]) {
 9     /** 人 */
10     Person *p = [[Person alloc] init];
11
12     /** 动物 */
13     Animal *a = [[Animal alloc] init];
14
15     /** 猫 */
16     Cat *c = [[Cat alloc] init];
17
18     // 父类指针指向Dog实例对象
19     Animal *d = [[Dog alloc] init];
20
21
22     // 动态检测真正对象是Dog
23     [d eat];
24
25     // 父类指针类型的参数也可以接收子类指针类型的参数
26     [p feedAnimal:a];
27     [p feedAnimal:c];
28
29
30     return 0;
31 }

编译运行结果:

2016-08-18 19:42:59.467 01-discription[759:669325] Dog eat
2016-08-18 19:42:59.468 01-discription[759:669325] Animal eat
2016-08-18 19:42:59.468 01-discription[759:669325] Cat eat
Program ended with exit code: 0

注解:

1. oc语言是编译的时候才动态检测,调用真正的对象,而不管是指针是什么类型。

2. 父类子针作为参数类型时,其子类子针参数都可以传入

3. 父类指针指向子类对象不能使用子类独有的方法,但可以使用强制转换类型,进而调用

时间: 2024-12-29 06:46:55

OC对象的三大特性:封装、继承和 多态的相关文章

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

面向对象的三大特性---封装继承多态

面向对象的三大特性---封装继承多态 首先我们来创建一个控制台程序 新建一个父类Person 创建一个子类继承父类Person 子类: main函数: 输出结果: 根据结果显示创建子对象,首先调用父类的构造函数在调用子类的构造函数. 继承的传递性 例如: A:B,B:C,则A:C ⅰ.继承过来之后被隐藏,有意隐藏加一个关键字"new",如果加了关键字"new",就告诉子类,父类里面的sayHi只能被隐藏,不能被覆写  ⅱ.继承过来之后被覆写/重写,覆写需要在父类里面

面向对象三大特性(封装/继承/多态)

引入:在面向对象思想中,有三大特性,封装  继承  多态. 思考:我们在使用类和对象实现编程的时候,到底是遵循这什么样的逻辑呢?为什么要这样规范类呢? 引入:面向对象很重要的思想就是隐藏,即外部不知道类内部是如何实现业务逻辑的,只管调用和使用结果,这个就是面向对象三大特性之一:  封装 1.封装[掌握] 定义:封装,字面意思就是将内容装到某个容器中,并进行密封保存,在面向对象思想中,封装指数据和对数据的操作捆绑到一起,形成 对外界的隐藏,同时对外提供可以操作的接口. 1.数据:即要操作的数据,在

面向对象三大特性:封装,继承,多态(一,封装和继承)

封装.继承和多态是面向对象程序设计的三个核心特性. 封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想. 继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,育雏利用已有的类来完成更复杂.更深入的程序开发. 多态允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变的容易. 一.封装 封装的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共变量和公共方法,而看不见方法的具体实现细节,

面向对象三大特性:封装,继承,多态(二、多态)

多态 一,多态的概念 多态(polymorphism), 是指一个名字可以有多种语义.在面向对象语言中,多态是指在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法.通常有两种途径实现多态:方法的重载和覆盖. 多态性允许以统一的风格处理已存在的变量及相关的类.多态性使得向系统里增加新功能变得容易.继承性和多态性是降低软件复杂性有有效技术. 二,多态的实现 1.方法的重载 方法重载时: 参数必须不同.参数个数不同或类型不同. 返回值可以相同,也可以不同. 重载的价值在于它允许通过使用一个

黑马程序员-OC对象的三大特性

OC语言是面向对象的语言,其三大特性必不可少. 一.封装是一个很重要的概念,它避免外界直接访问或修改对象的属性,可以过滤不合理的值,让外界不必关心内部的细节.通过set方法来让外部设置成员的属性值,通过get方法来获得对象属性值. 1 #import <Foundation/Foundation.h> 2 @interface Student : NSObject</span></span> 3 { 4 int _age; //以下划线开头,避免和局部变量弄混 5 in

Java面向对象三大特性 封装 继承 多态

1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现 举例: public class Human { private int age; private String name; public int get

面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)

多态(polymoph)指的是“执行期间(而非编译期间)”判断所引用对象的实际类型.,根据其实际的类型调用其相应的方法. 多态也叫动态绑定,也叫迟绑定. 多态的存在有三个必要条件: 要有继承 要有重写 父类引用指向子类对象

python面向对象三大特性之继承、多态

继承 什么是继承          所谓继承指提供了同一类对象共性的处理方法,子类继承父类共性的东西. 这样有利于代码的复用性,即子类拥有父类的方法.通过继承创建的新类称为"子类"或"派生类",被继承的类称为"基类"."父类"或"超类". 继承可以想象成什么是什么的关系 python中类的继承分为:单继承和多继承 class Parent1: # 父类1 pass class Parent2: #父类2 p