【发布时间】:2014-07-04 13:55:01
【问题描述】:
例如,如果我们有一个类Foo,它继承自类Bar,并符合协议Baz:
class Bar {}
protocol Baz {}
class Foo: Bar, Baz {}
如果我们事先不知道Bar 是一个类而Baz 是一个协议怎么办(例如,在阅读别人的代码时)。
在这种情况下,由于class Foo: 之后有多个声明,它可能很清楚。在 Swift 中,协议一致性声明必须在继承子句中的超类声明之后。另一方面,这也可能是一个没有继承的类,符合多种协议。
如果继承子句中只有一个声明呢?
class Foo: Bar {}
或者:
class Foo: Baz {}
在 Objective-C 中,协议名称用尖括号括起来是很清楚的。在 Swift 中,尖括号用于泛型。是否有语法支持使协议一致性在这种情况下更加直观?
【问题讨论】:
-
一旦
Baz开始警告您有未实现的必需方法,Bar不会这样做,差异会不会变得明显?我的意思是,在类的使用上,几乎没有区别,对吧?您将尝试将其作为特定类型的对象,而该特定类型可能是协议。 -
例如,在Objective-C中,
for (id<NSObject> obj in myArray)和for(NSObject *obj in myArray)之间的区别是完全不存在的。这一行中的语法看起来不同,但循环中的用法是相同的。为什么它是协议还是类很重要? (也可以右键-godefintion) -
命名约定怎么样?协议可以是
BazProtocol或BazDelegate——取决于协议的目的——如果你阅读header 或extension 可以快速识别它类。 -
另外,补充一点,一个类可以符合多个协议,所以
class Foo: Bar, Baz {}不保证Bar是一个超类,只是保证Baz是一个超类协议。 -
你是对的。但这里的主要观点是,我认为 Bryan 并不是在谈论他编写的一个类,它是他编写的协议的子类/符合协议。他说的是查看其他人编写的项目(或至少项目的子集),并且他希望能够轻松识别这是子类还是仅符合协议。他没有办法回到过去并修复不表明前开发人员或他以前的自己留下的类/协议的糟糕命名约定。