Swift 多态和类型转换

Swift 多态和类型转换,第1张

1、多态的概念 同样的 *** 作或者方法,不同的对象在执行时会出现完全不同的行为,这就叫多态。多态是讲具有同样父类的一批类之间,都重写了父类的同一个方法实现自己的行为,但是表现出来则各不相同。多态是一种设计模式。
//多态:相同的行为,对于不同的类拥有不同的展现形式
class Animal {
    func speak() {
        print("Animal speak")
    }
    func eat() {
        print("Aniaml eat")
    }
    func sleep() {
        print("Aniaml sleep")
    }
    func play() {
        print("Animal play")
    }
}
class Dog: Animal {
    override func speak() {
        print("汪汪汪...")
    }
    override func eat() {
        print("shit")
    }
    override func sleep() {
       print("趴着睡")
    }
    func drink() {
        print("喝水")
    }
}
class Cat: Animal {
    override func speak() {
        print("喵喵喵...")
    }
    override func eat() {
        print("fish")
    }
    override func sleep() {
        print("躺着睡")
    }
}
let dog = Dog()
let cat = Cat()
dog.speak()   //汪汪汪...
cat.speak()  //喵喵喵...
var animal = Animal()
//父类指针指向子类对象(里氏替换原则),如果子类重写了父类的方法,那么调用的就是子类的方法,如果子类没有重写父类的方法,则调用的是父类的方法
// 父类指针指向子类对象,编译看左边,运行看右边
animal = Dog()
animal.speak()
animal.sleep()
animal.play()
//animal.drink()   //父类指针不能调用子类独有的方法
2、多态、重载、重写的区别 1、多态是针对不同对象调用同一个方法,能产生不一样的结果。2、重载是在同一个类内实现了多个同名的方法,重载针对同一个对象,同名的方法,参数不同,调用后结果相同不相同不关心。3、重写是子类从父类继承过来的方法,和父类的方法名、参数都要一致,一定要加上关键字 override。 3、类型
class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}
class Movie: MediaItem {
    var director: String
    init(name: String, director: String) {
        self.director = director
        super.init(name: name)
    }
}
class Song: MediaItem {
    var artist: String
    init(name: String, artist: String) {
        self.artist = artist
        super.init(name: name)
    }
}
let library = [
    Movie(name: "泰坦尼克号", director: "张三"),
    Song(name: "甜蜜蜜", artist: "邓丽君"),
    Movie(name: "蜘蛛侠", director: "李四"),
    Song(name: "青花瓷", artist: "周杰伦"),
    Song(name: "Perfect", artist: "黄老板")
]
print(type(of: library))   // Array 打印出来是一个 MediaItem 类型的数组
4、类型检查 使用类型检查 *** 作符 ( is )来检查一个实例是否属于一个特定的子类。如果实例是该子类类型,类型检查 *** 作符返回 true ,否则返回 false
let movie = Movie(name: "泰坦尼克号", director: "张三")
print(movie is MediaItem)   // true
5、向下类型转换 某个类类型的常量或变量可能实际上在后台引用自一个子类的实例。当遇到这种情况时,可以尝试使用类型转换 *** 作符( as? 或 as! )将它向下类型转换至其子类类型。由于向下类型转换可能失败,类型转换 *** 作符就有了两个不同形式。条件形式, as? ,返回了一个将要向下类型转换的值的可选项。强制形式, as! ,则将向下类型转换和强制展开 结合为一个步骤。
for item in library {
    if let realItem = item as? Movie {  //使用 as? 向下做类型转换
        print(realItem.director)
    }
}
6、Any 和 AnyObject AnyObject 可以表示任何类类型的实例。Any 可以表示任何类型,包括函数类型。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/996961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存