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()
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))
4、类型检查
- 使用类型检查操作符 ( is )来检查一个实例是否属于一个特定的子类。如果实例是该子类类型,类型检查操作符返回 true ,否则返回 false
let movie = Movie(name: "泰坦尼克号", director: "张三")
print(movie is MediaItem)
5、向下类型转换
- 某个类类型的常量或变量可能实际上在后台引用自一个子类的实例。当遇到这种情况时,可以尝试使用类型转换操作符( as? 或 as! )将它向下类型转换至其子类类型。
- 由于向下类型转换可能失败,类型转换操作符就有了两个不同形式。条件形式, as? ,返回了一个将要向下类型转换的值的可选项。强制形式, as! ,则将向下类型转换和强制展开 结合为一个步骤。
for item in library {
if let realItem = item as? Movie {
print(realItem.director)
}
}
6、Any 和 AnyObject
- AnyObject 可以表示任何类类型的实例。
- Any 可以表示任何类型,包括函数类型。