[英]Swift - Return subclass type in overridden function of superclass
[英]superclass methods to return subclass type in swift
我有這個代碼:
class Dark: NSObject {
class var className: String {
return NSStringFromClass(self)!.componentsSeparatedByString(".").last!
}
var success = 0
class func devour<T: Dark>(params: Int) -> T {
var s = T()
return assign(s, params: params)
}
class func assign<T: Dark>(item: T, params: Int) -> T{
if item.dynamicType === self {
item.success = params
}
return item
}
}
class Black: Dark {
}
class Violet: Dark {
}
Black.className // returns "Black"
Violet.className // returns "Violet"
我這樣做時會出現問題:
var ret = Black.devour(5)
ret.success //returns 0 which I expect to be 5
ret.self // returns {Dark success 0} which I expect to be {Black success 0}
這里的問題是當子類使用繼承的方法devour時,它返回一個Dark
類型的對象。 我希望能夠在調用devour時返回子類類型而不是超類類型。 我這樣做的例子:
var ret = Black.devour(5)
ret類應該是Black
類而不是Dark
類。
我希望有人可以幫助我。 我真的沒有想法。 謝謝! 我想避免鏈接,我認為這是最后的手段。
事實證明我能夠做一些工作; 感謝這個問題的答案:轉換為typeof(self) 。
我需要做的就是創建一個返回Self類型對象的方法。
首先,我創建了一個類,它創建基類的實例並將其作為AnyObject的實例返回。
class func createDark() -> AnyObject {
var black = Black()
return black
}
當我返回一個Black
實例時,它會自動將它轉換為AnyObject,因為它是方法的指定返回類型(老實說,我只是想出了這個,這節省了我)。
然后我創建了一個調用createDark()
的輔助方法,並為實例分配屬性/屬性:
class func prepare<T: Dark>(params: Int) -> T{
var dark = createDark() as T
dark.assign(params)
return dark
}
我使用了類型為Dark
類型或其子類的泛型類型作為返回類型。
然后我這樣做了:
class func devour(params: Int) -> Self {
return prepare(params)
}
通過將Self
指定為返回類型,它會自動將其轉換為self類型,可以是Dark
類型或任何繼承它的類。
我的最終代碼如下所示:
class Dark: NSObject {
var success = 0
func assign(params: Int) {
if self.dynamicType === self { // I dont really have to do this anymore
self.success = params
}
}
class var className: String {
return NSStringFromClass(self)!.componentsSeparatedByString(".").last!
}
class func createDark() -> AnyObject {
var black = Black()
return black
}
class func prepare<T: Dark>(params: Int) -> T {
var dark = createDark() as T
dark.assign(params)
return dark
}
class func devour(params: Int) -> Self {
return prepare(params)
}
}
檢查它是否解決了問題:
var ret = Black.devour(5)
ret.success //now returns 5 as expected
ret.self // now returns {Black success 0} as expected
按預期工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.