V类协议中的继承

Shu*_*hra 8 swift

我有点搞砸了以下概念:

代码1:

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

class ClassNew: New {
    override func abc() {
        print("derived class")
    }
}
Run Code Online (Sandbox Code Playgroud)

代码2:

protocol New{}

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

class ClassNew: New {
    func abc() {
        print("derived protocol")
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 它们之间有什么区别Code 1,Code 2因为它们都有同样的目的?

  2. code 2,classNewinheriting来自新协议还是仅仅conforming是协议?

任何解释将非常感谢!

Jer*_*myP 8

代码1和代码2基本上是不一样的.

Code 1和Code 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"
Run Code Online (Sandbox Code Playgroud)

两个print语句都调用派生类 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"
Run Code Online (Sandbox Code Playgroud)

即使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"
Run Code Online (Sandbox Code Playgroud)

这次编译器知道对象应该有一个函数abc(),如果没有,则只使用扩展函数.然后应用类的正常继承规则.