У меня возникла проблема с отправкой методов методов.Метод распространения расширений протокола в Swift 2.0
У меня есть иерархия классов, который выглядит так:
protocol E {
func test()
}
extension E {
func test() {
print("jello")
}
}
class A: E {
}
class B: A {
func test() {
print("hello")
}
}
Но когда я называю test
на экземпляре класса B
статически вынужден быть набраны A
, «Желе» печатается, не «привет».
let b: A = B() // prints "jello" not "hello"
b.test()
Я понимаю, что test
метод печати «Желе» получает «интегрированы» в экземпляры A
(с A
соответствует E
протоколу). Затем я предоставляю другую реализацию test
внутри B
(которая наследует форму A
). Я думал, что здесь будет работать полиморфизм и вызовет test
на B
экземпляр, который хранится внутри A
. Ссылки будут печатать 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 –