A substituição da implementação padrão do protocolo em uma sub-classe não participa do envio dinâmico [duplicado]
Esta pergunta já tem uma resposta aqui:
Substituição de extensões de protocolo Swift 5 respostasConsidere o seguinte playground:
protocol A {
func f() -> String
}
extension A {
func f() -> String { return "AAAA" }
}
class B: A {}
class C: B {
func f() -> String { return "CCCC" }
}
let a: A = C()
let b: B = C()
let c: C = C()
a.f() // "AAAA" - why?
b.f() // "AAAA" - why?
c.f() // "CCCC"
Eu não entendo o porquêa.f()
eb.f()
Retorna"AAAA"
- eles deveriam voltar"CCCC"
Porquefunc f() -> String
deve ser enviado dinamicamente (como declarado no protocolo).
Se eu mudarclass B
para ficar assim:
class B: A {
func f() -> String { return "BBBB" }
}
então todas as três chamadas para.f()
Retorna"CCCC"
como esperado.
Eu sinto que é um bug no compilador Swift, verifiquei no Xcode 7.3.1 e 8.0-beta3, esse comportamento é reproduzível em ambos.
Esse é realmente um comportamento esperado?