1.4 继承和多态
一.继承
-
如果子类中有和父类中同名的方法,那么我们称之为方法重写
-
继承中的方法调用顺序,如果自己有就调用自己的方法,如果自己没有就从父类中找
-
方法的调用顺序,先自己再父类,以此向上找,如果到了基类还没有就会报错
reason: '-[Iphone signalWithNumber:]: unrecognized selector sent to instance 0x1003043c0'
二.多态
多态:事物的多种表现形态,父类指针指向子类对象
多态的优点:提高了代码的扩展性
注意点:如果父类指针指向子类对象,如果需要调用子类特有的方法,必须先强制类型转换为子类才能调用
// 父类指针指向子类对象
Animal *a = [Dog new];
// 将父类指针强制转为子类指针
Dog *d = (Dog *)a;
三.实例变量修饰符
@public 就是实例变量修饰符
@public
>可以在其它类中访问被public修饰的成员变量
>也可以在本类中访问被public修饰的成员变量
>可以在子类中访问父类中被public修饰的成员变量
@private
>不可以在其它类中访问被private修饰的成员变量
>可以在本类中访问被private修饰的成员变量
>不可以在子类中访问父类中被private修饰的成员变量
@protected
>不可以在其它类中访问被protected修饰的成员变量
>可以在本类中访问被protected修饰的成员变量
>可以在子类中访问父类中被protected修饰的成员变量
注意: 默认情况下所有的实例变量都是protected(手动在@interface中的大括号中定义成员变量)
@package
>介于public和private之间的
如果是在其它包中访问那么就是private的
如果是在当前代码所在的包种访问就是public的
实例变量修饰符作用域: 从出现的位置开始, 一直到下一个修饰符出现
如果没有遇到下一个实例变量修饰符, 那么就会修饰后面所有的实例变量
注:只在@implementation中实现方法为私有方法(未在@interface中定义声明)
四.%@打印对象description重写
%@是用来打印对象的,其实%@的 本质是用于打印字符串
- (NSString *)description
{
return [NSString stringWithFormat:@"age = %i, name = %@", _age, _name];
}
五.Property和synthesize来实现setter和getter
-
Xcode4.4之前,可以使用@property来代替getter/setter的声明,用@synthesize简化getter和setter方法的实现
// setter和getter方法的声明
@property int age;
// 运用@property编译器在编译时会帮我们替换成以下
/*
- (void)setAge:(int)age;
- (int)age;
*/
// setter和getter方法的实现
@synthesize age = _age;
// 运用@synthesize编译器在编译时会帮我们替换成以下
/*
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age
}
*/
如果在@synthesize后面没有告诉系统将传入的值赋值给谁, 系统默认会赋值给和@synthesize后面写得名称相同的成员变量
-
从Xcode4.4以后apple对@property进行了一个增强, 以后只要利用一个@property就可以同时生成setter/getter方法的声明和实现
没有告诉@property要将传入的参数赋值给谁, 默认@property会将传入的属性赋值给_开头的成员变量
@property有一个弊端: 它只会生成最简单的getter/setter方法的声明和实现, 并不会对传入的数据进行过滤
如果想对传入的数据进行过滤, 那么我们就必须重写getter/setter方法
如果不想对传入的数据进行过滤, 仅仅是提供一个方法给外界操作成员变量, 那么就可以使用@property
如果利用@property来生成getter/setter方法, 那么我们可以不写成员变量, 系统会自动给我们生成一个_开头的成员变量
注意: @property自动帮我们生成的成员变量是一个私有的成员变量, 也就是说是在.m文件中生成的, 而不是在.h文件中生成的
-
修饰符
()如果给一个属性同时提供了getter/setter方法, 那么我们称这个属性为可读可写属性
(onlyread)如果只提供了getter方法, 那么我们称这个属性为只读属性
(onlywrite)如果只提供了setter方法, 那么我们称这个属性为只写属性
()如果既没有提供getter也没有提供setter方法, 那么我们称这个属性为私有属性