我有点搞砸了以下概念:
代码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)
它们之间有什么区别Code 1,Code 2因为它们都有同样的目的?
在code 2,classNew是inheriting来自新协议还是仅仅conforming是协议?
任何解释将非常感谢!
代码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(),如果没有,则只使用扩展函数.然后应用类的正常继承规则.
| 归档时间: |
|
| 查看次数: |
2362 次 |
| 最近记录: |