我想在协议中声明一个类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" } }
或者,可以使用对于核心数据实体的事实,
类名通常定义为< ModuleName>.< EntityName>
这样实体名称就是类名的最后一个组成部分.
所以你可以将entityName()定义为
NSManagedObject的扩展方法(所有Core Data的超类)
对象类),如How can I create instances of managed object subclasses in a NSManagedObject Swift extension?:
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