2017-05-13 6 views
0

ArtistVC ist eine Unterklasse von CategoryVC, die eine Unterklasse von BrowserVC ist.Wie klassifiziere ich die Superklasse einer Superklasse in Swift?

meisten ArtistVC ‚s UITableView Datenquelle Methoden aufzuwickeln CategoryVC Aufruf‘ s Umsetzung dieser Methoden mit return super.tableView(tableView, cellForRowAt: adjustedIndexPath) (zum Beispiel), nachdem einige andere Dinge passieren, natürlich, wie die indexPath an die Methode übergeben zu modifizieren.

Aber manchmal möchte ich CategoryVC 's Implementierung umgehen und BrowserVC' s Implementierung verwenden.

super.super.someMethod() ist anscheinend nicht die Antwort. Ist das möglich?

+0

ist das nicht ein Problem mit Vererbung im Allgemeinen? – user3581248

+3

versuchen, Protokollerweiterungen mit Standardimplementierung, falls erforderlich, Vererbung wo möglich zu vermeiden. – KeranMarinov

+1

Wenn Sie das brauchen, dann ist Ihre Architektur kaputt. Suchen Sie nicht nach Workarounds für schlechte Architektur. – Sulthan

Antwort

0

Es gibt einen (komplizierten) Weg, dies zu tun, aber es erfordert, dass die Zwischenklasse zur Umgehung ihrer Überschreibung "beiträgt".

Zum Beispiel:

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

Eine einfachere Lösung besteht darin, eine andere Methode in "A" zu erstellen, die "final" ist und die Implementierung enthält. 'A.doIt' kann es intern nennen. Auf diese Weise haben alle Unterklassen weiterhin Zugriff auf die ursprüngliche Implementierung. In einer guten OOP-Architektur sollten jedoch alle Unterklassen 'super.doIt' aufrufen. Sie sollten nicht einfach die Implementierung ersetzen und möglicherweise die Oberklasse zerstören. – Sulthan

+0

@Sultan, stimme ich voll und ganz zu, aber ich wollte einen Weg veranschaulichen, ohne die ursprüngliche Klasse zu ändern. –

Verwandte Themen