我可以在Swift中使用协议支持多个继承



在Swift中,使用扩展程序可以在"协议"中给出方法主体。在我的代码中,我能够提供方法主体,请参阅

protocol Test1{
    func display()
}
extension Test1{
    func display(){
        print("display Test1")
    }
}
protocol Test2{
    func display()
}
extension Test2{
    func display(){
        print("display Test2")
    }
}
class ViewController: UIViewController,Test1,Test2 {
    var test1 : Test1?
    var test2 : Test2?
    func display() {
        print("display")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.test1 = self
        test1?.display()
        self.test2 = self
        test2?.display()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

我知道我在ViewController类中提供了Test1和Test2对象的地址。因此,"显示"打印了两次。但是在两个"协议"中,我都可以构成这些方法。

所以我的问题是,为什么苹果给我功能以在"协议"中编写方法主体?

任何人都可以帮助我理解此功能吗?

,尽管该问题看起来很简单,解释了以协议为导向的编程和重要性的所有方面,这会让我围绕它写整个博客:)

无论如何,以协议为导向的编程基本上使您能够利用多个继承,以对象为导向的编程语言(例如Java),Objective-C不支持Diamondproblem

现在尽管以协议为导向的编程使您可以建模功能/功能作为协议,而不是作为类实例方法(如目标c),我们必须同意,我们都始终享受继承!对孩子,仅通过调用super.methodname ???现在,您如何在协议中实现它???您无法重新使用代码??

因此,协议默认实现是向类提供默认实现的简单方法,这些方法只是想扩展和确认协议,但不费心修改。

示例:假设我有一个协议打印我的姓氏,如果父母班级确认它,它将与我打印与我相同的姓T更改!!!

仅仅因为您确认协议,您不需要提供其方法实现,如果该协议已经具有自己的默认实现。如果您想执行除默认实现以外的其他操作:)

protocol Test {
    func test1()
}
extension Test {
    func test1() {
        print("Yo man")
    }
}
protocol Test2 {
    func test2()
}
extension Test2 {
    func test2() {
        print("Bye man")
    }
}
class ViewController: UIViewController,Test,Test2 {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.test1()
        self.test2()
    }
}

您可以看到,我尚未为Test1或test2提供任何实现,但我将其仿佛已经为我实施了:)

那是协议默认实施的意图。希望它有帮助

观察:

您有两个协议,即test1和test2都具有相同的方法显示,现在您正在介绍钻石问题的基本问题,如果我简单地调用display()要拨打哪个实现?test1或test2的?Swift在编译时解决了它,并告诉您call self.display()

时,thembigiud使用display()

它仍然可能在UR代码中工作的唯一原因,因为您已经创建了两个类型test1和test2的变量,并且使用test1.display()和test2.display()调用了方法,这是没有歧义的,但是那是不是您想如何使用它吗?

因此,基本上您永远无法使用协议陷入钻石问题:)

最新更新