2015-09-23 3 views
6

У меня возникла проблема с отправкой методов методов.Метод распространения расширений протокола в 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 метод печати «Желе» получает «интегрированы» в экземпляры AA соответствует 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() 

Что отличается от принятия протокола, который добавляет новые методы моего родительского класса и обеспечивая новую реализацию в подклассе, чем то, прямо написал этот метод в родительский класс, а затем переопределить его в подклассе?

У вас, ребята, есть обходное решение?

+0

Не точное поведение, которое вы видите, но тесно связанное: http://nomothetis.svbtle.com/the-ghost-of-swift-bugs-future –

ответ

3

Пахнет как ошибка.

Единственный способ решения проблемы я придумал очень некрасиво ...

protocol E { 
    func test() 
} 

func E_test(_s: E) { 
    print("jello") 
} 

extension E { 
    func test() { E_test(self) } 
} 

class A: E { 
    func test() { E_test(self) } 
} 

class B: A { 
    override func test() { 
     print("hello") 
    } 
} 

let b: A = B() 
b.test() 
+0

Это действительно решение , но очень уродливый :) Будет файл радара, чтобы убедиться. –

+0

Это не ошибка, это предполагаемое поведение. Тем не менее, я тоже борюсь с этой проблемой прямо сейчас :) – manmal

+0

@manmal Если Apple намеревалась это сделать, все же все программисты находят это противоречивым и в конечном итоге взломали его, тогда я думаю, что его можно отнести к ошибке. – mogelbuster

Смежные вопросы