2017-05-13 40 views
0

​​是CategoryVC的子類,它是BrowserVC的子類。如何在Swift中對超類的超類進行分類?

大多數​​的UITableView的數據源方法拉閘調用CategoryVC的實現這些方法與return super.tableView(tableView, cellForRowAt: adjustedIndexPath)(例如),經過一些其他的事情發生,當然,像修改傳遞給方法的indexPath

但有時我實際上是想繞過CategoryVC的實現並使用BrowserVC的實現。

super.super.someMethod()顯然不是答案。這可能嗎?

+0

這不就是跟一般的繼承問題? – user3581248

+3

如果需要,使用默認實現嘗試協議擴展,儘可能避免繼承。 – KeranMarinov

+1

如果你需要這個,那麼你的體系結構已經壞了。不要爲糟糕的體系結構尋找解決方法。 – Sulthan

回答

0

有一個(令人費解)的方式來做到這一點,但它要求中間班「貢獻」繞過其覆蓋。

例如:

class A 
{ 
    func doIt(_ parameter:Int) { print("A.doIt(\(parameter))") } 
} 

class B:A 
{ 

    override func doIt(_ parameter:Int) { print("B.doIt(\(parameter))") } 
    var super_doIt:(Int)->() { return super.doIt } 
} 

class C:B 
{ 
    override func doIt(_ parameter:Int) 
    { super.super_doIt(parameter) } 
} 

let c = C() 
c.doIt(3) // A.doIt(3) 
+0

一個更簡單的解決方案是在'A'中創建一個不同的方法,它是'final'並且包含實現。 'A.doIt'可以在內部調用它。這樣,所有的子類都可以訪問原始的實現。 但是,在一個良好的OOP體系結構中,所有的子類都應該調用'super.doIt'。他們不應該只是取代實施,有可能打破超級班。 – Sulthan

+0

@Sulthan,我完全同意,但我想說明一種方法來做到這一點,而不需要修改原始類。 –