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


的实质是一种数据类型,类似于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
extension(括展)的简单理解
http://www.jianshu.com/p/43acce50c680

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 6,794评论 1 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,929评论 18 399
  • 一.成员变量与局部变量的区别 成员变量:在类中定义,用来描述对象将要有什么(属性)。可被本类方法和其他跟当前类有关...
    jeffierw阅读 3,547评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,374评论 19 139
  • 或许是第一次如此清晰的意识到死亡这种事,亲人就这样被突发的急症带走,一年有三百六十五天,之后的每一个三百六十五天中...
    顾言徜徉阅读 2,761评论 0 0