1

我正在学习有关 swift、OOP 和 POP 的所有知识。当我遇到一些意想不到的行为时,我一直在将它们混合在一起以创建一个抽象基类。它最好用代码来表达,我将展示它按预期工作,然后按预期工作(至少对我来说)。代码很长,但很简单。在这里它工作正常:

protocol GodsWill           {          func conforms() }
extension GodsWill          {          func conforms() { print("Everything conforms to God's Will") } }
class TheUniverse: GodsWill {          func conforms() { print("The Universe conforms to God's Will") } }
class Life: TheUniverse     { override func conforms() { print("Life conforms to God's Will") } }
class Humans: Life          { override func conforms() { print("Though created by God, Humans think they know better") } }

let universe = TheUniverse()
let life = Life()
let humans = Humans()

universe.conforms()
life.conforms()
humans.conforms()
print("-------------------------")
let array:[GodsWill] = [universe,life,humans]
for item in array { item.conforms() }

这是输出:

The Universe conforms to God's Will
Life conforms to God's Will
Though created by God, Humans sometimes think they know better
-------------------------
The Universe conforms to God's Will
Life conforms to God's Will
Though created by God, Humans sometimes think they know better

这正是我所怀疑的。但是当第一个类没有 conforms() 的自定义实现时,我在我的应用程序中遇到了这个问题,如下所示:

protocol GodsWill           {          func conforms() }
extension GodsWill          {          func conforms() { print("Everything conforms to God's Will") } }
class TheUniverse: GodsWill {  }
class Life: TheUniverse     {          func conforms() { print("Life conforms to God's Will") } }
class Humans: Life          { override func conforms() { print("Though created by God, Humans sometimes think they know better") } }

let universe = TheUniverse()
let life = Life()
let humans = Humans()

universe.conforms()
life.conforms()
humans.conforms()
print("-------------------------")
let array:[GodsWill] = [universe,life,humans]
for item in array { item.conforms() }

请注意,TheUniverse 没有 conforms() 的自定义实现。这是输出:

Everything conforms to God's Will
Life conforms to God's Will
Though created by God, Humans sometimes think they know better
-------------------------
Everything conforms to God's Will
Everything conforms to God's Will
Everything conforms to God's Will

前三行 print() 正是我所期望和想要的,但后三行真的让我感到困惑。由于 conforms() 是协议要求,因此它们应该与前三行相同。但是我得到的行为好像 conforms() 是在协议扩展中实现的,但没有列为协议要求。The Swift Programming Language 参考手册中没有关于此的内容。这段 WWDC 视频正好在30:40证明了我的观点。

那么,是我做错了什么,误解了功能,还是在 swift 3 中发现了一个错误?

4

1 回答 1

1

经过进一步调查,我认为这与 WWDC 视频没有太大关系。

Universe 没有定义conforms方法,因此调用conformsUniverse 将打印“Everything...”。

生活定义了一种conforms方法。conforms但是,由于它继承自因扩展而已经实现的 Universe,因此conforms协议并不真正需要该方法。因此,协议类型忽略了类中的conforms方法Life。换句话说,conformsinLife中的方法隐藏conforms协议扩展中的方法,正如我们在以下输出中看到的:

let a: TheUniverse = Life()
a.conforms()
Life().conforms()
// output:
// Everything conforms to God's Will
// Life conforms to God's Will

人类有另一种conforms方法。这一次,它是用 定义的override。但是,这override不会覆盖conforms协议扩展中的方法。相反,它覆盖了中的conforms方法Life,该方法是 的直接超类Humans。这可以通过以下代码的输出来证明:

let a: Life = Humans()
a.conforms()
// output:
// Though created by God, Humans sometimes think they know better

所以毕竟协议扩展中的方法没有被覆盖。所以当你创建一些对象并将其放入[GodsWill]时,阴影没有效果,因此调用了协议扩展方法。

于 2016-10-23T07:35:57.167 回答