2016-08-17 3 views
0

Класс B является подклассом класса А (B : A)Метод Override не называется?

Я инициализирует класс как B.init()

При вызове в А, перекрываться method() никогда не вызывается, если я использую бросок:

class A { 
    ... 
    self.method() //A method called 
    (self as! B).method() //B method called 
} 

Почему ?

Поскольку я инициализирую экземпляр как B, я ожидаю, что он вызывает метод overriden, но это не так, если только я не использую актерский состав.

+0

Я думаю, что есть что-то происходит, что не очевидно, от того, что вы опубликовали. В простейшем случае будет вызываться метод B. –

+0

Дубликат [Переопределение методов в расширениях Swift] (http://stackoverflow.com/questions/38213286/overriding-methods-in-swift-extensions) ([см. Ниже поток комментариев] (http://stackoverflow.com/questions/38996783/overriden-method-not-called # comment65346443_38997022)) – Hamish

ответ

0

Я думаю, что у вас есть некоторая ошибка за сценой. Я построил свой пример, и он работает, как ожидалось:

class A { 
    func method() { 
     print("A") 
    } 
    func check() { 
     method() 
     (self as? B)?.method() 
    } 
} 
class B: A { 
    override func method() { 
     print("B") 
    } 
} 

Где-то еще:

let b = B() 
b.check() 
//B 
//B 
+0

Он также должен работать, если 'check' просто вызывает' self.method() '. –

+0

@PhillipMills работает с 'self' также, так как' self' добавил неявно –

+0

Я понял это. Кажется, что метод не вызывается, если он находится в расширении B (это был мой случай). Итак, если я добавлю метод в расширение B, а не в класс B, он не будет вызван. Зачем? Он все равно должен переопределить метод класса А или нет? – aneuryzm

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