gpt4 book ai didi

swift - 获取父类(super class)的克隆

转载 作者:行者123 更新时间:2023-11-28 11:20:17 27 4
gpt4 key购买 nike

这是我的 Playground 片段:

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 类。但是对于子类,我希望它返回父类(super class)(所以上面它应该返回 VBox)。

我知道我可以覆盖 VBox 中的clone 函数,但我想知道是否有更聪明的方法。

最佳答案

你的意思是子类。 Box 是父类(super class),这就是您要返回的内容。

这与以下内容非常相似:

不过,这不是完全相同的问题,因为您处理的是类而不是协议(protocol),所以我们可以看一下那个例子。首先,正确的工具是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com