获取超类的克隆
Getting clone of 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
函数 return 在所有情况下都是 Box
class。但是对于 subclass,我希望它成为 return superclass(所以在它上面应该 return VBox
)。
我知道我可以 override
VBox
中的 clone
函数,但我想知道是否有更聪明的方法。
你的意思是子类。 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
会让你犯那个错误并最终崩溃。
这是我的游乐场片段:
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
函数 return 在所有情况下都是 Box
class。但是对于 subclass,我希望它成为 return superclass(所以在它上面应该 return VBox
)。
我知道我可以 override
VBox
中的 clone
函数,但我想知道是否有更聪明的方法。
你的意思是子类。 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
会让你犯那个错误并最终崩溃。