2017-05-13 19 views
0

​​はCategoryVCのサブクラスであり、BrowserVCのサブクラスです。Swiftでスーパークラスのスーパークラスをクラス分けする方法は?

いくつかの他のものは、メソッドに渡されたindexPathを変更するように、当然のことながら起こる後​​のほとんどは、(例えば)return super.tableView(tableView, cellForRowAt: adjustedIndexPath)でこれらのメソッドのの実装さんのUITableViewのデータソースメソッドはCategoryVCを呼ぶ羽目 "。

しかし、私は実際に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

より簡単な解決法は、 'final'で実装を含む' A'に別のメソッドを作成することです。 'A.doIt'はそれを内部的に呼び出すことができます。このようにして、すべてのサブクラスは元の実装にアクセスできます。 しかし、良いOOPアーキテクチャでは、すべてのサブクラスはとにかく 'super.doIt'を呼び出す必要があります。実装を置き換えるだけでなく、スーパークラスを破壊する可能性もあります。 – Sulthan

+0

@Sulthan、私は全く同意しますが、元のクラスを変更せずにそれを行う方法を説明したかったのです。 –

関連する問題