我可以覆盖在Swift中使用协议声明的泛型属性吗?

时间:2016-10-24 00:57:54

标签: ios swift cocoa-touch inheritance override

这样的方法在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方法中(这显然是一个假设的例子)。这可能是一些JSON数据或一些XML数据。现在我可以每次实现一个不同的viewDidLoad方法,具体取决于控制器是使用XML还是JSON,但如上所示,我认为我可以将它封装在基类中,然后我可以继承这个基础VC并只调用super。 viewDidLoad中()。困扰我的唯一部分是:

override var serialisableObject: JSONObject

我被允许这样做吗?这是个好主意吗?

1 个答案:

答案 0 :(得分:1)

您无法更改serialisableObject的类型,因为这会违反LSP

您可以使用setter / getter将子类中的另一个属性有效地别名为超类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) 
    }
}