swift – 类方法的协议
发布时间:2020-12-14 05:43:29 所属栏目:百科 来源:网络整理
导读:我想在协议中声明一个类func,我打算从A,B和C类符合这个协议. B和C继承自A. 基本上我想在B和C中覆盖这个func,同时仍然在A中提供一个实现. 所以,我必须声明我的协议如下: protocol MyManagedObjectCoolStuff { static func entityName() - String} 然后我在A
我想在协议中声明一个类func,我打算从A,B和C类符合这个协议.
B和C继承自A. 基本上我想在B和C中覆盖这个func,同时仍然在A中提供一个实现. 所以,我必须声明我的协议如下: protocol MyManagedObjectCoolStuff { static func entityName() -> String } 然后我在A中有这个: class A: NSManagedObject { } class B: A { } class C: A { } extension A: MyManagedObjectCoolStuff { static func entityName() -> String { return "Animal" } } extension B: MyManagedObjectCoolStuff { override static func entityName() -> String { return "Bat" } } extension C: MyManagedObjectCoolStuff { override static func entityName() -> String { return "Cat" } } 这里的问题很明显,Xcode证实:“类方法会覆盖’最终’类方法”. 我该如何解决这个问题?我不能在协议中使用class func …我不知道如何抽象这个. 谢谢!
在类定义中,static是类final的别名, 所以它标记了一个无法覆盖的类型方法(或属性) 在子类中. 由于您要覆盖子类中的方法, extension A: MyManagedObjectCoolStuff { class func entityName() -> String { return "Animal" } } extension B: MyManagedObjectCoolStuff { override class func entityName() -> String { return "Bat" } } extension C: MyManagedObjectCoolStuff { override class func entityName() -> String { return "Cat" } } 或者,可以使用对于核心数据实体的事实, 所以你可以将entityName()定义为 extension NSManagedObject { class func entityName() -> String { let classString = NSStringFromClass(self) // The entity is the last component of dot-separated class name: let components = split(classString) { $0 == "." } return components.last ?? classString } } 并在必要时覆盖它: class A: NSManagedObject { } class B: A { } class C: A { } extension C { override class func entityName() -> String { return "Cat" } } println(A.entityName()) // A println(B.entityName()) // B println(C.entityName()) // Cat (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |