プロトコルメソッドディスパッチに関する問題に直面しています。Swift 2.0のプロトコル拡張メソッドディスパッチ
私はそのように見えるのクラス階層があります。
protocol E {
func test()
}
extension E {
func test() {
print("jello")
}
}
class A: E {
}
class B: A {
func test() {
print("hello")
}
}
しかし、私は静的A
を入力することを余儀なくクラスB
のインスタンスにtest
を呼び出すとき、「ゼリー」「こんにちは」ではなく、印刷されますが。
let b: A = B() // prints "jello" not "hello"
b.test()
私の理解は、test
メソッド印刷が「ゼリー」(A
はE
プロトコルに準拠するため)A
のインスタンスに「統合」されることをです。次にtest
の別の実装をB
(これはフォームA
を継承しています)内に提供します。多形性はここではうまくいくと思って、A
参照内に格納されているB
のtest
インスタンスを呼び出すとhello
と表示されます。ここで何が起こっていますか?
:
class A {
func test() {
print("jello")
}
}
class B: A {
override func test() {
print("hello")
}
}
let b: A = B() // prints "hello"
b.test()
何直接この方法で書かれたよりも、私の親クラスに新しいメソッドを追加するプロトコルを採用し、サブクラスで新しい実装を提供するとは異なります親クラスを作成し、それをサブクラスでオーバーライドしますか?
皆さんは回避策がありますか?
ないあなたが見ている正確な行動が、密接に関連:http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future –