1.4 继承和多态

一.继承

  • 如果子类中有和父类中同名的方法,那么我们称之为方法重写

  • 继承中的方法调用顺序,如果自己有就调用自己的方法,如果自己没有就从父类中找

  • 方法的调用顺序,先自己再父类,以此向上找,如果到了基类还没有就会报错

reason: '-[Iphone signalWithNumber:]: unrecognized selector sent to instance 0x1003043c0'

二.多态

多态:事物的多种表现形态,父类指针指向子类对象

多态的优点:提高了代码的扩展性

注意点:如果父类指针指向子类对象,如果需要调用子类特有的方法,必须先强制类型转换为子类才能调用

  1. // 父类指针指向子类对象
  2. Animal *a = [Dog new];
  3. // 将父类指针强制转为子类指针
  4. Dog *d = (Dog *)a;

三.实例变量修饰符

 @public 就是实例变量修饰符

 

 @public

 >可以在其它类中访问被public修饰的成员变量

 >也可以在本类中访问被public修饰的成员变量

 >可以在子类中访问父类中被public修饰的成员变量

 

 @private

 >不可以在其它类中访问被private修饰的成员变量

 >可以在本类中访问被private修饰的成员变量

 >不可以在子类中访问父类中被private修饰的成员变量

 

 @protected

 >不可以在其它类中访问被protected修饰的成员变量

 >可以在本类中访问被protected修饰的成员变量

 >可以在子类中访问父类中被protected修饰的成员变量

 

 注意: 默认情况下所有的实例变量都是protected(手动在@interface中的大括号中定义成员变量)

 

 @package

 >介于publicprivate之间的

 如果是在其它包中访问那么就是private

 如果是在当前代码所在的包种访问就是public

 

 

 实例变量修饰符作用域: 从出现的位置开始, 一直到下一个修饰符出现

 如果没有遇到下一个实例变量修饰符, 那么就会修饰后面所有的实例变量

 

注:只在@implementation中实现方法为私有方法(未在@interface中定义声明)

四.%@打印对象description重写

%@是用来打印对象的,其实%@的 本质是用于打印字符串

  1. - (NSString *)description
  2. {
  3.    return [NSString stringWithFormat:@"age = %i, name = %@", _age, _name];
  4. }

五.Property和synthesize来实现setter和getter

  • Xcode4.4之前,可以使用@property来代替getter/setter的声明,用@synthesize简化getter和setter方法的实现

  1. // setter和getter方法的声明
  2. @property int age;
  3. // 运用@property编译器在编译时会帮我们替换成以下
  4. /*
  5. - (void)setAge:(int)age;
  6. - (int)age;
  7. */
  8. // setter和getter方法的实现
  9. @synthesize age = _age;
  10. // 运用@synthesize编译器在编译时会帮我们替换成以下
  11. /*
  12. - (void)setAge:(int)age
  13. {
  14.      _age = age;
  15. }
  16. - (int)age
  17. {
  18.       return _age
  19. }
  20. */

 

如果在@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方法, 那么我们称这个属性为私有属性

 





posted @ 2015-09-03 21:52  文刂Rn  阅读(193)  评论(0编辑  收藏  举报