簡體   English   中英

Swift:協議一致性 - 這是一個錯誤嗎?

[英]Swift: Protocol conformance - Is this a bug or not?

(在XCode 6 beta 3上)

此代碼引發錯誤“類型MyClass不符合協議MyProtocol”。

class A {}
class B : A {}

protocol PPP {
    func foobar(x: B)
}
class MyClass : PPP {  // --> error: doesn't conform to PPP
    func foobar(x: A) {}
}

但是,下面的代碼是可以的:

class MyClass : PPP {
    func foobar(x: B) {}
}
class MySubClass : MyClass {
    override func foobar(x: A) {}
}
var p:PPP = MySubClass()

當我在MySubClass上明確應用PPP時,再次引發相同的錯誤:

class MyClass : PPP {
    func foobar(x: B) {}
}
class MySubClass : MyClass, PPP {  // --> error: doesn't conform to PPP
    override func foobar(x: A) {}
}

我不確定這種行為是不是一個bug。 你認為?

這不是一個錯誤。 在您的第一個示例中,您的類沒有完全實現PPP中的所有方法。 foobar(x: B)func foobar(x: A)不同,即使你可以將B傳遞給func foobar(x: B)func foobar(x: B) {}MyClass並且它應該可以工作。

問題是第一個代碼是PPP協議中的方法:

func foobar(x: B)

期望收到B的實例。 您將覆蓋指定類型A的參數,該參數與B不同,即使它是超類。 為了確認協議,您必須完全按照協議中聲明的方法實現。 我不認為這是一個錯誤。

更有趣的是,在最后一種情況下:

class MyClass : PPP {
    func foobar(x: B) { print ("BaseB")}
}

class MySubClass : MyClass, PPP {
    override func foobar(x: B) { print("B") }
}

var xx = MySubClass()

xx.foobar(B())

輸出B ,這是我所期望的。 代替:

class MyClass : PPP {
    func foobar(x: B) { print ("BaseB")}
}

class MySubClass : MyClass, PPP {
    override func foobar(x: A) { print("A") }
    override func foobar(x: B) { print("B") }
}

var xx = MySubClass()

xx.foobar(A())
xx.foobar(B())

輸出AA ,而我期望AB 聞起來像臭蟲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM