2016-05-30 5 views
0

Java/C++のような言語から来ており、私たちは部分クラスまたは抽象クラスの実装に慣れています。Swift:プロトコル(インターフェイス)の部分クラス実装を行う方法?

protocol ProtocolA { 
    func x() 
    func y() 
} 

// attempt to partially implement ProtocolA 
class AbstractProtocolA: ProtocolA { 
    func x() { /* implementation */ } 

    // does not implement function y 
} 

class ConcreteA1: AbstractProtocolA { 
    func y() { /* implementation */ } 
} 

class ConcreteA2: AbstractProtocolA { 
    override func x() { /* implementation */ } 
    func y() { /* implementation */ } 
} 

が、これはスウィフトでは不可能であり、この場合には、私はコンパイルエラーType 'AbstractProtocolA' does not conform to protocol 'ProtocolA'になるだろう...このOODのユースケースをカバーするために、別のSwiftyの方法は何ですか?

UPDATE: この制限を回避する方法はには次のようになります。

enum ProtocolAError: ErrorType { 
    case NotImplementedException(methodName: String) 
} 

class AbstractProtocolA: ProtocolA { 
    func x() { /* implementation */ } 

    func y() { throw ProtocolAError.NotImplementedException(methodName: "y") } 
} 

が、ここでは、実行時ではなく、時間をコンパイルする(すなわち、抽象AbstractProtocolAをインスタンス化)設計/プログラミングミスをシフトします。

+0

エクステンションを見ましたか? – Wain

+0

'optional'キーワードを見ましたか? – ZeMoon

+0

いいえ、私は見ていない...答えを書くことは怠惰ではない:D –

答えて

5

あなたはプロトコル拡張とプロトコルのデフォルトの実装を作成することができます

protocol ProtocolA { 
    func x() 
    func y() 
} 

extension ProtocolA { 
    func x() { 
     // Do something (or nothing) here as a default implementation 
    } 
} 

は、それが動作ホープ;)

PS:迅速にプロトコル指向プログラミングに見て、ここでいくつかのリンクがあります: https://www.raywenderlich.com/109156/introducing-protocol-oriented-programming-in-swift-2 https://developer.apple.com/videos/play/wwdc2015/408/

+1

あなたの答えはほぼそこにあると思う...私は私のOPで達成したいと思ったものを正確にカバーするためにあなたは 'func y () 'を使ってください。それ以外の場合は、正確には答えません。D –

+0

大丈夫です。 – javiazo

0

これは最初、悪い設計の決定のようです。
ここに掲載されているように、デフォルト実装のプロトコル拡張やoptionalキーワードのようなソリューションがありますが、すべてのメソッドをオプションにする必要があります。
私はあなたが別のプロトコルでメソッドを分割することを検討すべきだと思います。

+0

私は、言語の制限がデザインの粒度/正規化レベルを決めるべきではないと言います。言い換えれば、プロトコルごとに1つの方法で終わることを意味しています。私はエクステンションが私のOPへの答えだと思う。 –

+0

@ GiovanniAzuaプロトコルは、クラスに特定の動作に従うように要求するために使用される。実際に何かを行うデフォルトの実装を持つことが1つのことです。しかし、何もしないデフォルトの実装をすることは彼らの役割を悪用しており、そのクラスはおそらくそのプロトコルに準拠していないか、またはそのメソッドがオプションであるべきであることを伝えるべきです。共通の親にその空のメソッドを追加し、それをただ1つの子でオーバーライドするのと同じです。 –

+0

私は決して何もしないデフォルトの実装を望んでいませんでした。 OPコードは、私がカバーしなければならないユースケースの疑似サンプルでした。なぜあなたはそれを仮定しているのかわかりません... –

関連する問題