And*_*son 3 polymorphism protocols ios swift
我是面向对象编程的新手,我正在尝试围绕协议、委托和多态性进行思考。我最近观看了一个培训视频,该视频宣传当您有两个具有相似方法实现的相似类时,协议是优雅地实现这一目标的最佳解决方案。那讲得通。然而,一些额外的研究让我发现了多态性,这听起来也是一种首选方法,而您可以简单地使用基类来建模功能并在子类中更新这些方法。
所以,我有两个问题。首先,我对多态的理解正确吗?我对所有这些概念仍然很陌生。其次,协议是否胜过多态性,你什么时候会使用一种而不是另一种?
谢谢!
在某些情况下,协议是更合适的方式,而在某些情况下,基类是解决方案。
在 Swift 基类中允许您共享相同的实现从而减少代码冗余。但是,基类不会强制其子类覆盖其方法。因此,如果所有子类都应该覆盖某些特定方法,则基类将很短来强制执行它(swift 中没有抽象类可以将实现与需求混合)。有很多方法可以“破解”它,例如,通过包含fatalError()在基类实现中以强制程序员覆盖它(否则基实现会导致崩溃) - 但这是一个运行时错误。因此,如果基类只适合您,它可能是一个很好的方法,但是如果您正在实现一个库/框架并且您希望库的用户对其进行子类化,那么您必须考虑这些问题。
另一方面,协议是合同定义。协议定义了必须实现哪些方法才能实现该协议。所以每个协议实现类都将被迫实现这些方法。这通常是你想要的——你想通过合约绑定实现类来满足协议的要求。然而,让实现类共享代码有点困难。看看这个的协议扩展。协议扩展允许您向协议方法添加“默认”实现。
您可以查看我关于面向协议编程的博客文章,了解更多关于它的争论。