一、封装
1> 封装的定义
2> 封装的好处
3> set方法和get方法
set方法
① 作用:为成员变量赋值 ② 命名规范 1)名字必须以set开头 2)set后紧跟成员变量名,且首字母要大写 3)返回值一定是void类型 4)一定接收一个类型与要赋值的成员变量一致的参数 ③ 若成员变量为只读类型,通常不需要set方法 ④ set方法可以用于监听成员变量的改变,而触发相应的操作
get方法
① 作用:返回成员变量的值 ② 命名规范 1)方法名与成员变量名一致 2)返回值类型与要返回的成员变量一致 3)不需要接收任何参数
二、继承
1> 继承的定义
2> 优缺点
优点
① 基于原有的模型,扩充特有的方法 ② 抽取重复代码,降低代码冗余 ③ 建立类与类之间的联系
缺点
① 耦合性太强
3> 基本使用
4> 使用注意
5> 继承与组合
继承
① 当两个类用有相同的属性和方法时,通常将相同的属性和方法抽取到 一个父类,使用继承关系 ② 若A类用有B类的部分属性和方法,通常让B类继承自A类
组合
① 当一个类包含另一个类的全部属性和方法,通常让这个类作为另一个 类的属性,使用组合关系 ② 若A类用有B类的全部属性和方法,通常让B类作为A类的属性
6> self与super
self
① 基本使用 1)self是一个指针,指向调用当前方法的对象/类 2)可以调用成员变量和方法 3)使用self来调用成员变量,可以区分同名的局部变量 ② 使用注意 1)用self调用当前方法会引发死循环 2)不能使用self在类方法中调用对象方法,反之亦然 3)不能使用self调用函数
super
① 基本使用 1)每个类都会有一个super指针指向其父类 2)子类重写父类的方法时,若想保留父类的一些行为,通常用super 调用父类中被重写的方法 ② 使用注意 1)通过super可以直接调用父类中的类方法/对象方法 2)所调用方法的类型与当前方法的类型一致,如:若当前方法为类 方法,则调用父类中的类方法,反之亦然
三、多态
1> 动态绑定的概念
2> 基本使用
3> 优缺点
优点
① 当一个函数/方法用父类类型作为参数,可以接收父类、子类对象 ② 降低了代码的冗余
缺点
① 不能使用父类指针调用子类的方法 ② 编译器只会检测语法是否有误,只有在运行时才会根据动态绑定结果 调用相应的方法
4> 使用注意
四、示例
/* 1.定义一个Animal类,方法:eat 2.定义一个Dog类和Cat类继承自Animal类 3.定义一个Person类,属性:animal(Dog或Cat);方法:feed(喂动物) */ #import <Foundation/Foundation.h> /********Animal类*********/ @interface Animal : NSObject //声明Animal的eat方法 - (void)eat; @end /*Animal类的实现*/ @implementation Animal //此处可以不实现,只在子类中实现,但是编译器会警告 - (void)eat { NSLog(@"Animal在吃") } ed /*****Dog类继承自Animal****/ @interface Dog : Anmal ed /*Dog类的现*/ @implementationDog //重写eat方法,使其符合Dg对象 - (voidea { NSLog(@"Dog在吃") } ed /*****Cat类继承自Animal****/ @interface Cat : Anmal ed /*Cat类的现*/ @implementationCat //重写eat方法,使其符合Ct对象 - (voidea { NSLog(@"Cat在吃") } ed /****Person类用有Animal***/ @interface Person : NSObec { //使每个人拥有一个动物,用组合 Animal *_anial } //为_animal属性设置set和gt方法 - (void)setAnimal:(Animal *)anial; - (Animal *)anial; //声明一个方法,使人能给自己用有的相应物喂食 - (void)fed; ed /*Person类的现*/ @implementation Peson - (void)setAnimal:(Animal *)anma { _animal = anial } - (Animal *)anma { return _anial } - (void)ee { [_animal et] } ed /******测试函数main******/ int man( { //创建两个Persn对象 Person *p = [Person nw]; Person *p2 = [Person nw]; //创建一个Dg对象 Dog *d = [Dog nw]; //创建一个Ct对象 Cat *c = [Cat nw]; //给对象p的Animal属性赋值为Dg对象 [p setAnimald]; //给对象p的Animal属性赋值为Ct对象 [p2 setAnimalc]; //调用p、p2的feed方法,检测态效果 [p fed]; [p2 fed]; retur 0; }