OC2.6
是一个重写的小练习,略
2.7-2.8多态
同一种类型具有多种表现形态
根据:(父类变量可以指向子类对象: 例: 动物 * dog = [ [狗 alloc] init];)
可以定义方法传进的参数是父类对象,既然定义的是父类对象,所以就可以在传参数的时候传进子类对象,那么传进不同的子类对象的话,该方法得到的结果也就不一样了,so,说同一种类型具有多种表现形态。
多态的产生条件:
1.要有继承
2.要有方法覆盖
3.父类声明的变量指向子类对象
2.10权限修饰符的使用
修饰符 内部类 子类 任何地方
private yes
protected yes yes
public yes yes yes
OC中默认的是protected,不要声明为public,那样会破坏类的封装性
在类的声明里面,声明参数的地方用权限修饰符 ,如下
{
@*****
属性1
属性2
@******
属性3
属性4
}
@protected 受保护的属性,子类可以访问此修饰符修饰的属性(默认的情况下就是protected权限)
@private 私有的,只在该类内部使用,子类和其他类都不可以访问
@public 公有的,所有类都可以访问
@packaeg 使用@package修饰的属性,只能在当前框架中才能使用(java中的包内访问)
注意1:OC里面的方法没有被修饰的情况,OC里面的方法都是公开的。但是有的时候,我们需要一个私有的方法,只能被本类自己访问,这种种情况我们就需要只在.m文件里面去实现这个方法,而不在.h文件里面声明,即可。(但是如果通过该类的对象,在main里面也可也调用该方法,只是编译器会发出警告,提示该类中没有这个方法,但是运行的时候还是可以运行的)。 所以说OC中的私有方法只是一个约定而已,在语法上没有真正的私有方法。
注意2:由于OC支持C语言,既然OC里面没有私有的方法,那么就可以在.m文件里面定义一个C语言的函数来解决这一个问题
static void privateFuncation{ //函数
//函数内部
} //但这不是OC,这是C语言里面的函数
2.11@class和import
import:导入一个头文件,获取该头文件中的定义——属性和方法(类1里面import类2,就是将类2.h里面的信息拷贝到类1.h里面了)
注意:两个类相互导入的话就会出现问题,而且很难找到。出现这种需要两个类相互导入的情况的话,就需要使用到@class了
@calss:告诉编译器有这么一个类,具体这个类怎么定义的一无所知。(@class解决相互引用的手段:类1.h文件里面将import类2改成@class类2,就是告诉编译器有类2这么一个类。但是@class类2没有将类2的定义拷贝到类1.h文件里面,所以当前文件不知道类2里面都有什么属性、方法。但是没关系,同样有解决的办法,我们需要只需要把@class类2当做引用取用,在类1.m文件里面#import类2,这样的话,不光可以避免相互引用,还相当于把类2的引用拷贝到类1.m文件里面供类1来使用(不在类1.m文件里引用类2.h文件也可以,建议引用))
注意:在继承里面子类的.h文件不能用“@class父类”的形式引用父类,因为子类继承父类的时候有这样一句语法“@interface子类:父类”就会报错,就像前面说的@class只是告诉编译器有这个类,但对这个类是怎么定义的一无所知,所以还想要继承父类,还对父类的定义一无所知,那当然是不靠谱了。
所以建议:在允许的条件下.h文件尽量使用@class文件,.m文件里面再使用#import语法。