Swift在超类函数中从相应的子类调用类函数
我想在超类中实现init(coder aDecoder: NSCoder!)
,并在运行时通过在超类的特定子类上调用一个类方法来在所有子类中使用它。
MySuperClass
class func dummyDict() -> NSDictionary init(coder aDecoder: NSCoder!) { for(key,value) in self.class.dummyDict(){ -------------------- ^ | | Get this from the corresponding subclass at runtime! NSLog("encoding \(value) for key \(key)") } }
MySuperClass
子类可能在运行时访问类函数dummyDict()
吗?
我想我明白了你的意思。 你创build一个Base
类,实现一个初始化器和一个类(静态)函数:
class Base { class func dummyDict() -> Dictionary<String, String> { return ["base1": "val1"] } init() { for (key, value) in self.dynamicType.dummyDict() { println("encoding \(value) for key \(key)") } } }
接下来,您要创build子类,并使初始化程序调用dummyDict
方法的重写版本。 你只需要重写该方法:
class Subclass1 : Base { override class func dummyDict() -> Dictionary<String, String> { return ["subclass1": "sub1"] } }
现在,当你创build一个Subclass1
的实例时,打印的是:
encoding sub1 for key subclass1
这是预期的产出。
注意初始化器中的for
循环使用self.dynamicType.dummyDict()
而不是Base.dummyDict()
。 后者总是调用在Base
类中定义的类方法,而前者在从Base
inheritance的实际类的范围内调用它
我们必须使用type(of:)
。
所以安东尼奥的例子现在是:
class Base { class func dummyDict() -> [String: String] { return ["base1": "val1"] } init() { for (key, value) in type(of: self).dummyDict() { print("encoding \(value) for key \(key)") } } } class Subclass1 : Base { override class func dummyDict() -> [String: String] { return ["subclass1": "sub1"] } }
[DELETED]
使用dynamictypes安东尼奥在他的答案中build议
class Test : NSObject { class func dummy() -> String { return "t" } init() { super.init() println("\(self.dynamicType.dummy())") } } class Test1 : Test { override class func dummy() -> String { return "t1" } } class Test2 : Test { override class func dummy() -> String { return "t2" } }