swift中的继承与多态

2019-11-20  本文已影响0人  千伞万伞

在面向对象编程开发的时候常用的两个思想即继承与多态,最近学到这块,就整理一下,有心人一起学习,另附我学习swift时候常用的两个网站如下:
文档
视频

class A
{
}
class B : A
{
    var name:String
    
    init(name:String) {
        self.name = name
    }
    
    func printName()
    {
        print("B对象的name: " + self.name)
    }
}
class C : A
{
    var name:String
    
    init(name:String) {
        self.name = name
    }
    
    func printName()
    {
        print("C对象的name: " + self.name)
    }
}
//  注意返回类型是A类型
func getObject(param:Int) -> A
{
    if param > 10 {
        return B(name: "小B")
    } else {
        return C(name: "小C")
    }
}

对象的相等性判断

var fyObj = getObject(param: 5) // 本句相当于 var obj:A = getObject(param: 5)
if fyObj is B
{
    let p = fyObj as! B
    p.printName()
}
if fyObj is C {
    let p = fyObj as! C
    p.printName()
}

swift提供了方便的可选项绑定

var obj:A = getObject(param: 15)
// 可选项绑定
if let p = obj as? B {
    p.printName()
}else if let p1 = obj as? C {
    p1.printName()
}

swift中的扩展:extension

// 扩展
extension A
{
    var age:Int
    {
        return 1
    }
    // 计算属性,以上写法默认get 方法,并且代表只读,强行set 会出现变异错误:Cannot assign to property: 'age' is a get-only property,以上代码相当于
//    var age1:Int
//    {
//        get
//        {
//            return 1
//        }
//    }
    func toString(param:Int) -> String
    {
//        self.age = param // Cannot assign to property: 'age' is a get-only property
        let str = String(param)
        return str
    }
    /**  同时也可以扩展类型方法(其实就是OC中常说的类方法),另:
         static 自带final 属性,是不可被重写的
         class 也可用于声明类型方法,允许子类重写
         所以static 相当于 final class
    */
    static func toString()
    {
        print(type(of: self))
    }
}

var a = A()
print(a.age) // 1
print(a.toString(param: 5)) // 5

A.toString() // A.Type

重写

class D: C {
    var nickName: String = "Hi😄我是D "
    override var description: String{
        return nickName + super.description
    }
    override func printName() {
        print("D 对象的nickName为:\(nickName)" + name)
    }
    // 重写属性观察器,如果name重新设置,则会调用printName方法
    override var name: String{
        didSet
        {
            printName()
        }
    }
}
var d = D(name: "d")
print(d.description) // 打印:Hi😄我是D hello,我是C
d.printName() // 打印:D 对象的nickName为:Hi😄我是D d
d.name = "我还是D,只是我长大了" // 打印:D 对象的nickName为:Hi😄我是D 我还是D,只是我长大了

在学习的过程中,我只是对觉着需要整理的地方做整理,以便以后自己能够做到有的放矢,同时也能方便他人能够在短时间内学习到重点的知识点,向原创致敬

上一篇 下一篇

猜你喜欢

热点阅读