2017-09-04 108 views
3

我有点搞砸具有以下概念:继承的类Vs的协议

代码1:

class New{ 
    func abc(){ 
     print("new class") 
    } 
} 

class ClassNew: New { 
    override func abc() { 
     print("derived class") 
    } 
} 

代码2:

protocol New{} 

extension New{ 
    func abc(){ 
     print("new protocol") 
    } 
} 

class ClassNew: New { 
    func abc() { 
     print("derived protocol") 
    } 
} 
  1. Code 1Code 2之间有什么区别,因为它们都有相同的作用?

  2. code 2classNew距离新的协议inheriting或只是conforming到协议?

任何解释将不胜感激!

+0

类或协议应该有更好的命名,例如'MyClass'而不是'myClass'。 –

+0

更改名称,完成! –

+1

看到这个简单的视频:[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

回答

3

代码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(),如果它不只会使用扩展功能。然后,类的正常继承规则适用。

1

classNew简单地说是符合第二代码中的协议。 Swift中的每个协议都是如此,因为继承是目前不支持带协议的

这也回答了你的第一个问题:有在这种使用情况下,两个码之间没有显著差异,但一般来说,协议有利于其他类型的东西比子类。

+0

但是实现协议是一种实现多重继承的方法,那么在单一继承的情况下它是不是真的? –

+2

@ShubhamMishra协议完全与继承无关。 – Fogmeister

+0

看到这个链接@Fogmeister:https://stackoverflow.com/questions/41054396/can-i-able-to-support-multiple-inheritance-with-protocol-in-swift –

1

Code 1Code 2完全相同,只是概念上不同而已。

如果我们用简单的话来说,Class定义了对象本身,而Protocol定义了对象的行为。

如果与Java相比,类似于Interfaces

Checkout the Protocol Documentation

+0

不,它们不一样。 – JeremyP

1

代码2protocol extensions一个例子。最大的区别是你不能拨打super.abc()代码2 - 你必须提供一个方法实现,它不在任何super上下文中。

只是我的看法 - 不要使用协议默认实现,因为如果你真的需要时忘记提供“覆盖”,编译器将不会保存你。

+0

这不是默认实现。该协议声明没有功能默认。 – JeremyP

+0

@JeremyP你是对的,这是一个纯粹的扩展 –