获得超类的克隆

时间:2015-03-01 15:36:40

标签: swift clone subclass superclass

这是我的游乐场代码:

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

我的clone函数在所有情况下都返回Box类。但是对于子类我希望它返回超类(因此它应该返回VBox)。

我知道我可以在overrideclone VBox函数,但我想知道是否有更聪明的方法。

1 个答案:

答案 0 :(得分:3)

你的意思是子类。 Box是超类,这就是你要归还的东西。

这非常类似于以下内容:

但是,这不是完全相同的问题,因为你处理的是类而不是协议,所以我们可以通过这个例子。首先,正确的工具是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会让你犯这个错误,最终会崩溃。