美文网首页iOS学习
swift 类的封装、继承 、重写、多态

swift 类的封装、继承 、重写、多态

作者: 幻_空 | 来源:发表于2016-07-24 20:05 被阅读0次


    的实质是一种数据类型,类似于int、char等基本类型,不同的是它是一种复杂的数据类型。因为它的本质是类型,而不是数据,所以不存在于内存中,不能被直接操作,只有被实例化为对象时,才会变得可操作。



    封装(Encapsulation) 将程序的实现细节隐藏的一种方法
    目的是保护数据和算法是代码更加容易理解和维护
    实现手段
    访问权限控制
    默认 internal
    public:可以在任何地方访问
    internal:在模块 framwork 静态库可以访问
    private:只能定义的文件使用

    存储属性
    类可以直接存储数据的属性 成员变量
    例如 var name="xiaomao"
    可以获取设置或修改属性类容的时机
    例如:

    class Animal{
        var name:String!
        var age:Double!{
            willSet(newValue){print("\(age)将要设置为:\(newValue)")}
            didSet{print("已经设置为:\(age)")}
        }
      init(){
            name="aaa"
            age=10
      }
    }
    

    测试:

    var ani=Animal()
    ani.age=28
    

    输出:

    10.0将要设置为:28.0
    已经设置为:28.0
    

    计算属性
    本身不能存储数据,而是由对象的其他数据计算出来
    例如 定义一个圆
    确定了半径就能确定面积
    确定了面积也能确定半径

    class Circle {
        var r:Double=0
        var area:Double!{
            set(newArea){
                print("原来面积:",area,"现在面积:",newArea)
                r=sqrt(newArea/3.14)
            }
            get{return r*r*3.14}
        }
    }
    

    测试:

    var cir=Circle()
    cir.r=10
    print("半径:",cir.r,"面积:",cir.area)
    cir.area=3.14
    print("半径:",cir.r,"面积:",cir.area)
    

    输出:

    半径: 10.0 面积: 314.0
    原来面积: 314.0 现在面积: 3.14
    半径: 1.0 面积: 3.14
    ```
    
    **继承(inherita):**
    子类继承父类所有除了私有以外的功能和属性
    子类在父类上可扩张
    子类可以重新定义父类的一些功能
    swfit 只能单继承
    
    **重写(覆盖):**
    重新定义父类一些方法
    需要加关键字override
    
    范例:
    
    定义动物类
    ```
    class Animal{
        var name:String!
        var age:Double=0
        }
        var weigth:Double!
        init(){
            name="animal"
            age=10
            weigth=10
        }
        func eat() {
            print(name,"吃东西了!")
        }
    }
    ```
    狗继承Animal重写eat() 新增bite()
    ```
    class Dog: Animal {
        func bite() {
            print(name,"咬了一口!")
        }
        override func eat() {
            print(name,"吃了一根骨头")
        }
    }
    ```
    猫继承Animal重写eat() 新增claw()
    ```
    class Cat: Animal {
        func claw()  {
            print(name,"抓了一下")
        }
        override func eat() {
            print(name,"吃了一条鱼干")
        }
    }
    ```
    测试用例:
    ```
    let cat1=Cat()
    cat1.name="白玉灵猫"
    var dog1=Dog()
    dog1.name="单身汪"
    var ani=Animal()
    ani.name="动物"
    dog1.bite()
    cat1.claw()
    
    dog1.eat()
    cat1.eat()
    ani.eat()
    
    //Animal可以转换为Dog 
    //dog1=Animal()
    //反过来不行
    //报错Cannot assign value of type 'Animal' to type 'Dog'
    ani=Dog()
    ani.name="霹雳狗"
    ani.eat()
    
    //强转为Dog 调用bite()
    dog1=ani as! Dog
    dog1.bite()
    
    //执行子类实现 eat()
    ani=Cat()
    ani.name="黄玉灵猫"
    ani.eat()
    ```
    输出
    ```
    单身汪 咬了一口!
    白玉灵猫 抓了一下
    单身汪 吃了一根骨头
    白玉灵猫 吃了一条鱼干
    动物 吃东西了!
    霹雳狗 吃了一根骨头
    霹雳狗 咬了一口!
    黄玉灵猫 吃了一条鱼干
    ```
    **多态(Polymorphism)**
    给多个不同类型的对象发送同一消息(即调用同一方法),系统根据对象不同执行不同操作
    注意!当一个父类的变脸引用他的一个子类对象,并且调用父类被覆盖(重写)的方法时,执行**子类实现**!
    
    测试
    ```
    var ani=Animal()
    ani.eat()
    ani=Dog()
    ani.eat()
    ani=Cat()
    ani.eat()
    ```
    输出
    ```
    animal 吃东西了!
    animal 吃了一根骨头
    animal 吃了一条鱼干
    ```
    **链接**
    protocol (协议)的简单理解
    [http://www.jianshu.com/p/4988132b2b86](http://www.jianshu.com/p/4988132b2b86)
    extension(括展)的简单理解
    [http://www.jianshu.com/p/43acce50c680](http://www.jianshu.com/p/43acce50c680)

    相关文章

      网友评论

        本文标题:swift 类的封装、继承 、重写、多态

        本文链接:https://www.haomeiwen.com/subject/gjqgjttx.html