POP面向协议编程

234 阅读1分钟

一、继承

  • LGMonkey继承LGAnimal
  • LGMonkey重写了leg属性、和eat方法
class LGAnimal: NSObject {
    var leg:Int {return 4}
    func run(){
        print("\(leg)只脚奔跑")
    }
    func eat(){
        print("肉")
    }
}

class LGMonkey: LGAnimal {
    override var leg: Int {return 2}
    override func eat() {
        print("🍑")
    }
}

二、协议

  • 实现协议就必须要实现协议里面的属性,和方法
  • 如果在extension中实现了sayHello方法(属性同理),LGTeacherLGStudent中就可以不必须实现sayHello方法;反之如果extension没有实现,就必须在LGTeacherLGStudent中实现
  • 在结构体、类和extension中,协议属性的实现有点不同
    • 结构体:var name: String
    • 类:var name: String = ""
    • extension:var name: String { return "dyz" }
  • 父类扩展了这个协议extension UIViewController: LGUIProtocol{ },子类就不能再扩展extension TableViewController: LGUIProtocol{ },会报错哦'TableViewController' inherits conformance to protocol 'LGUIProtocol' from superclass here
protocol LGProtocl {
    /// 协议属性
    var name: String {get}
    /// 协议方法
    func sayHello()
}

extension LGProtocl {
    var name: String {
        return "hello"
    }
    func sayHello() {
        print("extension hello")
    }
}

/// LGTeacher结构体来实现协议
struct LGTeacher: LGProtocl{
    var name: String
//    func sayHello() {
//        print("你好")
//    }
}

struct LGStudent: LGProtocl {
    var name: String
//    func sayHello() {
//        print("别烦我,我要学习POP")
//    }
}

class Person: LGProtocl {
    var name: String = ""
    
    func sayHello() {
        print("你好")
    }
}

extension UIViewController: LGProtocl {
    var name: String {
        return "dyz"
    }
}