这是我的游乐场片段:

class Box {
  func clone() -> Box {
    return Box() // <- how to return superclass here?
  }
}

class VBox:Box { }

let vb = VBox()
let cBox = vb.clone() // now cBox is a Box, not a VBox

在所有情况下,Myclone函数都返回一个类。但对于子类,我希望它返回超类(因此上面应该返回Box)。
我知道我可以VBox内部的override函数,但我想知道是否有更聪明的方法。

最佳答案

你是说亚纲。Box是超类,这就是你要返回的。
这与以下情况非常相似:
Protocol func returning Self
Swift protocol and return types on global functions
不过,这不是完全相同的问题,因为您处理的是类而不是协议,所以我们可以通过这个示例。首先,正确的工具是init,而不是clone

class Box {
    let a: String
    init(_ a: String) { self.a = a }
    convenience init(copy: Box) { self.init(copy.a) }
}

class VBox:Box {}

let vb = VBox("test")
let cBox = VBox(copy: vb)

您可以看到,这工作得很好,因为VBox不添加其他属性。但是如果VBox确实添加了其他属性,那么您将得到所有正确的错误,这些错误要求您实现init
class Box {
    let a: String
    init(_ a: String) { self.a = a }
    convenience init(copy: Box) { self.init(copy.a) }
}

class VBox:Box {
    let b: String
    init(_ a: String, _ b: String) {
        self.b = b
        super.init(a)
    }
    convenience init(copy: VBox) {
        self.init(copy.a, copy.b)
    }
}

let vb = VBox("test", "this")
let cBox = VBox(copy: vb)

请注意,这会阻止您尝试将Box复制到VBox中(因为这不会初始化所有参数)。如果您希望这样做,您需要提供一个copy(Box)初始化器。这是使用init的好处。它为你记录所有的规则。NSCopying会让你犯错误,最终崩溃。

关于swift - 获得父类(super class)的克隆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28795409/

10-13 03:26