//多态:相同的行为,对于不同的类拥有不同的展现形式
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 可以表示任何类型,包括函数类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)