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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容

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