zoukankan      html  css  js  c++  java
  • objective-c自学总结(三)---面向对象的封装,继承与多态

    面向对象的三大特性

    • 封装
    • 继承
    • 多态

    1.封装:

    • 隐藏属性,方法或实现细节的过程称为封装
    • 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一
    • 然后以新的完整形式呈现出来 例如,两种或多种化学药品组成一个胶囊
    • 将方法和属性一起包装到一个单元中,单元以类的形式实现 对象同时具有属性和方法两项特性
    • 对象的属性和方法通常被封装在一起,共同体现事物的特性,二者相辅相成,不能分割

    2继承:

    2.1继承的定义:

    • A是B
    • 如果这句话能说得通,在设计程序的时候就可以看成是继承关系
      子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性

    为什么要用继承:观察下面两段代码

    //卡车类
    @interface Truck : NSObject
    {
        // 品牌
        NSString *_brand;
    
        //颜色
        NSString *_color;
        float _maxWeight;
    }
    
    -(id)initWithlamp:(float)wattage;
    //启动
    -(void)star;
    //刹车
    -(void)stop;
    @end
    //出租车类
    @interface Taxi : NSObject
    {
        // 品牌
        NSString *_brand;
    
        //颜色
        NSString *_color;
        float _company;
    }
    -(id)initWithengine:(NSString*)model  Withcapacity:(NSInteger)capacity;
    //启动
    -(void)star;
    //刹车
    -(void)stop;
    @end

    代码存在很明显的重复现象
    如何改进?有没有可能建立继承关系让子类自动继承父类的属性和方法?

    • 定义一个通用的类,他有基本的实例变量。子类只要继承了该类,就可以拥有这些实例变量。子类也可以定义自己的实例变量。
    • 被继承的类叫超类或父类,继承父类的类叫子类或派生类。
    • OC中继承的语法规则为:
      @interface 子类 : 父类

    • 子类自动继承父类的属性和方法
      改进如下

    //车类
    @interface Car : NSObject
    {
        // 品牌
        NSString *_brand;
    
        //颜色
        NSString *_color;
    }
    //启动
    -(void)star;
    //刹车
    -(void)stop;
    @end
    //卡车类
    @interface Truck : NSObject
    {
        float _maxWeight;
    }
    
    -(id)initWithlamp:(float)wattage;
    @end
    //出租车类
    @interface Taxi : NSObject
    {
        float _company;
    }
    -(id)initWithengine:(NSString*)model  Withcapacity:(NSInteger)capacity;
    @end

    这样就很好的避免了代码的重复编写。

    2.2:再谈self/super

    2.2.1:再谈self
    • 使用self优先调用当前类的方法
    • 当前类如果没有则调用父类。
    2.2.1:再谈super
    • super关键字可以调用从父类继承下来的方法
    @implementation Worker
    -(id)init{
        self=[super init];
        if(self)
        {
    
        }
        return self;
    }

    2.3:方法重写

    • 通过方法的重写,子类可以改变从父类继承的行为
    • 被重写的方法定义必须与父类中的方法完全一样。
     //父类的方法
    -(void)work
    {
           NSLog(@"人开始干活");
    }
     //子类重写的方法
    -(void)work
    {
           NSLog(@"学生开始学习");
    }

    3.多态:

    下面来看一组代码

    //父类
    @implementation Paint
    -(void)paintf
    {
        NSLog(@"打印机打印");
    }
    @end
    //子类(重写)
    @implementation blackPrint
    -(void)paintf
    {
        NSLog(@"黑白");
    }
    @end
    
    //子类(重写)
    @implementation colorPaint
    -(void)paintf
    {
        NSLog(@"彩色");
    }
    @end
    
    #import "Person.h"
    
    @implementation Person
    //使用彩色打印机
    -(void)paintWithColor:(colorPaint*)paint
    {
        [paint paintf];
    }
    //使用黑白打印机
    -(void)paintWithBlack:(blackPrint*)paint
    {
        [paint paintf];
    }
    @end
    

    可以看出来每次增加一个打印机,都要在Person类中增加相应的打印方法,代码的课扩展性和可维护性极差。
    这样我们就可以利用多态来解决。
    多态是指同一种类型具有多种表现形态。
    也就是说不同的子类继承同一个父类这些子类可以看做是同一类型,子类覆盖父类的方法,每个子类实现的功能不相同,这就是多态。
    多态的条件

    • 必须存在继承关系
    • 子类重写父类的方法
    • 父类声明的变量指向子类对象
     paint*color=[[colorPaint alloc] init];
     paint*black=[[blackPrint alloc] init];

    解决方法

    @implementation Persion
    -(void)doPaint:(Paint*)paint
    {
        [paint paintf];
    }

    使用多态后,当需要增加新的子类类型时,无需更改Person类,程序的可扩展性和可维护性增强。

  • 相关阅读:
    nodejs
    jsp路径问题之base
    WordPress固定链接修改后访问文章页面404
    IntelliJ IDEA使用教程 (总目录篇)
    SQL SELECT DISTINCT 语句
    数据库的内连接、外连接(左外连接、右外连接、全外连接)以及交叉连接(转)
    SQL之group by 和 having
    SQL之group by
    通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。
    java.lang.NoClassDefFoundError: Could not initialize class com.demo.jdbc.utils.MyJdbcUtils
  • 原文地址:https://www.cnblogs.com/leishitou/p/5436202.html
Copyright © 2011-2022 走看看