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





  • 相关阅读:
    多重背包
    摘花生
    完全背包问题
    01背包问题
    数字金字塔
    ES6 Object.assign()的用法
    umi---className设置多个样式
    npm 安装yarn
    html引入其他html的几种方式
    react打包去掉map文件
  • 原文地址:https://www.cnblogs.com/Xfsrn/p/4780806.html
Copyright © 2020-2023  润新知