2016-07-02 9 views
0

スイフトのプロトコル指向プログラミングと、エクステンションの仕組みと、それが提供できる拡張性のレベル。スイフトプロトコル指向エクステンション

Extension - doSomethingA Self: ProtocolB, ProtocolC 

私は実行するためにすべての拡張を保証できることをとにかくあり:

は、私は私が印刷され得ることである遊び場

protocol ProtocolA { 
    func doSomethingA() 
} 

protocol ProtocolB { 
    func doSomethingB() 
} 

protocol ProtocolC { 
    func doSomethingC() 
} 

extension ProtocolA { 
    func doSomethingA() { 
     print("Extension - doSomethingA") 
    } 
} 

extension ProtocolA where Self: ProtocolB { 
    func doSomethingA() { 
     print("Extension - doSomethingA Self: ProtocolB") 
    } 
} 

extension ProtocolA where Self: ProtocolC { 
    func doSomethingA() { 
     print("Extension - doSomethingA Self: ProtocolC") 
    } 
} 

extension ProtocolA where Self: ProtocolB, Self: ProtocolC { 
    func doSomethingA() { 
     print("Extension - doSomethingA Self: ProtocolB, ProtocolC") 
    } 
} 

extension ProtocolB { 
    func doSomethingB() { 
     print("Extension - doSomethingB") 
    } 
} 

extension ProtocolC { 
    func doSomethingC() { 
     print("Extension - doSomethingC") 
    } 
} 

class Implementation: ProtocolA, ProtocolB, ProtocolC { 
} 

let obj = Implementation() 

obj.doSomethingA() 

を駆け抜けた次のコードスニペットを持っています。

理想的には、次の出力を得たいと考えています。私はProtocolAがProtocolBとProtocolCの両方に一致する実装を提供していない場合、私はスウィフトは、それの面で最強の一致を選択することを理解して

Extension - doSomethingA 
Extension - doSomethingA Self: ProtocolB 
Extension - doSomethingA Self: ProtocolC 
Extension - doSomethingA Self: ProtocolB, ProtocolC 

は、実際には、種類のだ、私は、コンパイル時にエラーになるだろう。とにかく私はこれを回ることができるのですか?

ありがとうございました。

+1

あなたはそれをしたい***すべての3 *** ??? – Fattie

+0

@JoeBlowそうです。 – Peymankh

+0

あなたはそれを意味しますか?これをコードに入力すると、 'obj.doSomethingA()'は実際には4つの異なるルーチン*を実行するようにします。だから、あなたが "super ...."と呼んだかのように、4回、よく3回、継承の連鎖で? – Fattie

答えて

2

拡張のポイントは、のデフォルト実装をプロトコルメソッドに提供することです。

あなたの例では、コンパイラは具体的なオブジェクトに最も適した拡張子のdoSomethingA()メソッドを呼び出すことになりますが、それだけです。あなたは、コールのあなたのポイントに

見ることができるように:あなたはメソッド呼び出しを実行している

obj.doSomethingA()

。これは解決され、4つではなく1つのメソッド呼び出しにディスパッチされます。

これは、サブクラス化によってメソッドをオーバーライドして、基本クラスのメソッドを呼び出す場合と似ています。派生したメソッドだけが呼び出され、基本クラスのメソッドは呼び出されません。その場合、サブクラスからsuper.method()を呼び出すことができます。あなたのケースでは

あなたが複数のメソッドが呼び出さ取得したい場合は、あなたが彼らに拡張子を経由して別の名前や実装を与えることができ、そしてちょうどそのようなすべてのプロトコルを実装するクラスを作成します。

class A: ProtocolA, ProtocolB, ProtocolC { 

    func all() { 
     doSomethingA() 
     doSomethingB() 
     doSomethingC() 
    } 
} 

利点のここでの拡張は、class Aが3つのメソッドの実装を提供する必要がないことです。

+0

十分な公正。ありがとう。 – Peymankh

関連する問題