代码1和代码2基本上是不一样。
代码1和代码2之间的区别是什么,因为他们都服务于相同的目的?
不,他们没有。第一个定义了一个类层次结构,第二个定义了一个协议(一个API,如果你喜欢的话)和一个符合它的类型。
在代码2中,classNew是从新协议继承还是仅仅符合协议?
它符合协议。没有涉及的继承(如果你是迂腐)。
代码1定义了一个基类和一个继承自它的类。子类覆盖了基类的功能abc()
和它的行为,你会期望给一个类层次结构,即
let x: New = ClassNew()
let y: ClassNew = ClassNew()
print(x.abc()) // prints "derived class"
print(y.abc()) // prints "derived class"
两个打印语句调用abc()
派生类的在码2你定义一个协议没有方法,并使用扩展方法扩展协议。请注意,这是而不是一个“默认方法”在协议中没有任何内容默认。然后定义一个符合协议的类,并添加一个恰好与扩展方法名称相同的新方法。因为abc()
所谓的版本是在编译时
protocol New2{}
extension New2{
func abc(){
print("new protocol")
}
}
class ClassNew2: New2 {
func abc() {
print("derived protocol")
}
}
let y2: ClassNew2 = ClassNew2()
let x2: New2 = y2
print(x2.abc()) // prints "new protocol"
print(y2.abc()) // prints "derived protocol"
即使X2和Y2 是同一对象不同功能的版本被称为静态确定的区别(从单纯的类层次结构)是很重要的。这是因为编译器不允许假定x2的任何内容,除非它能从协议中推断出来。所以它不知道该对象有自己的abc()
,所以它必须调用扩展函数。
如果您已经定义的协议是这样的:
protocol New3{
func abc()
}
extension New3{
func abc(){
print("new protocol")
}
}
class ClassNew3: New3 {
func abc() {
print("derived protocol")
}
}
let y3: ClassNew3 = ClassNew3()
let x3: New3 = y3
print(x3.abc()) // prints "derived protocol"
print(y3.abc()) // prints "derived protocol"
这一次的编译器知道对象应该具有的功能ABC(),如果它不只会使用扩展功能。然后,类的正常继承规则适用。
类或协议应该有更好的命名,例如'MyClass'而不是'myClass'。 –
更改名称,完成! –
看到这个简单的视频:[Protocol-Oriented Views](https://www.youtube.com/watch?v=AySlYrel7fc),并阅读[什么是面向协议的编程在Swift中?它带来了什么附加值?](https://stackoverflow.com/questions/37530346/what-is-protocol-oriented-programming-in-swift-what-added-value-does-it-bring) – Honey