2016-10-24 3 views
0

このようなアプローチは、スウィフトに罰金であるか、またはそれは悪い考えであるでしょう:Swiftでプロトコルで宣言されたジェネリックプロパティをオーバーライドできますか?

protocol Serializable { 
    func serealize() 
} 

class SomeBaseVC: UIViewController { 

    var serialisableObject: Serializable? 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     serialisableObject?.serealize() 
     //Do some other generic stuff with serialisableObject 
    } 

} 

class JSONObject: Serializable { 
    func serealize() { 
     //serealize 
    } 


} 

class SomeChildVCWhichHasSomeGenericBehaviour: SomeBaseVC { 
    override var serialisableObject: JSONObject 

    override func viewDidLoad() { 
     super.viewDidLoad() //Now this would do serealisation of JSONObject 
     //And now do something specific to just this VC 
    } 
} 

だから、ポイントはプロトコルを使用して、私のスーパークラスで実装私の見解コントローラの多くの人に共有されているいくつかの一般的な振る舞いを持つことです。いくつかのオブジェクトをシリアライズし、viewDidLoadメソッドで保存する必要のあるView Controllerがたくさんあるとします(これは明らかに仮説的な例です)。これは、いくつかのJSONデータまたはいくつかのXMLデータである可能性があります。今度は、コントローラがXMLまたはJSONで動作しているかどうかに応じて、毎回別のviewDidLoadメソッドを実装できますが、上に示したように、ベースクラスにカプセル化できると思うので、このベースVCから継承してスーパークラスを呼び出すことができます。 viewDidLoad()。私を悩ます唯一の部分は次のとおりです。

override var serialisableObject: JSONObject 

私はそれを許可しましたか?それは良いアイデアですか?

+0

あなたは 'SomeChildVCWhichHasSomeGenericBehaviour'のスーパークラスを示していないが、私はあなたはそれが' SomeBaseVC'になりたいと仮定します - この場合、 'serialisableObject'の型はLSP - https://en.wikipedia.org/wiki/Liskov_substitution_principleに違反するので変更できません。プレイグラウンドでコードを試してみると、 'serialisableObject'を再定義できないというエラーが表示されます。 – Paulw11

+0

@ Paulw11はい、そうです、それはSomeBaseVCです。どのように私はそのような行動を達成するだろう任意のアイデア? –

+0

プロパティに 'Serializable'に準拠するオブジェクトを割り当て、' serialisableObject?.serealize() 'が適切な関数を呼び出します。その意味は、View Controllerのサブクラスでは、プロパティである特定のタイプ – Paulw11

答えて

1

それはあなたが効果的にスーパーserialisableObjectプロパティへのサブクラスで別のプロパティのエイリアスにセッター/ゲッターを使用することができますLSP

に違反するので、あなたはserialisableObjectの種類を変更することはできません。これは、スーパークラスは、エイリアスを使用しながら、あなたのビューコントローラのサブクラスで特定のタイプを使用することができるようになる:

class SomeChildVCWhichHasSomeGenericBehaviour: SomeBaseVC { 

    var jsonThing: JSONObject? 

    override var serialisableObject: Serializable? { 
     get { 
      return jsonThing 
     } 

     set { 
      self.jsonThing = newValue as? JSONObject 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() //Now this would do de-serealisation of JSONObject 
     print(self.jsonThing) 
    } 
} 
+0

このアプローチは実際に使われているのですか?これは悪い習慣ですか? –

関連する問題