swift 类的封装、继承 、重写、多态
2016-07-24 本文已影响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)