面向对象三大特性:封装、继承、多态
封装:对外公开接口,内部隐藏实现细节。可防止外界任意修改数据
继承:如果类与类之间存在逻辑关系,且有共用部分。即可抽取重复代码形成父类,子类拥有父类的成员变量和方法。如果类与类之间没有逻辑关系,可以将共同部分封装为单独的类,让其他类引用。
缺点:耦合性太强,子类与父类相互依赖
注意:
1.不允许子类和父类拥有相同的成员变量
2.每个类都有一个superClass指针指向其父类,每个对象都有一个isa指针指向类
3.调用方法会优先在当前类找,找不到就会继续到父类中找
多态:父类指针指向子类对象
优点:在需要使用父类类型时,可以传入父类、子类对象(例如方法传参为父类类型,既可传父类对象,也可传子类对象)
class Animal: NSObject {
func animalRun() {
print("animal run")
}
}
class Dog: Animal {
func dogrun(){
print("dog run")
}
}
func featuresTest(a: Animal) {
guard let tem = object_getClass(a) else {
return
}
print("isa:\(NSStringFromClass(tem)),superClass:\(class_getSuperclass(tem))")
}
例如:
let dog = Dog()
let animal: Animal = Dog()
featuresTest(a: dog)
featuresTest(a: animal)
缺点:父类类型不能直接调用子类方法,必须强转为子类类型后才能调用。
注意:
1、程序运行时才会确定对象的真实类型
2、如果存在多态,父类可以转为子类类型,不存在则转不了
let dog = Dog()
let animal: Animal = Dog()
animal.animalRun()
(animal as! Dog).dogrun()
打印:
animal run
dog run
网友评论