【问题标题】:Getting clone of superclass获取超类的克隆
【发布时间】:2015-05-01 22:56:34
【问题描述】:

这是我的游乐场 sn-p:

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)。

我知道我可以在VBox 中使用override clone 函数,但我想知道是否有更聪明的方法。

【问题讨论】:

  • VBox 是 Box 的 子类,而不是超类。 – 这可能是您正在寻找的:Protocol func returning Self
  • 感冒了,我的大脑仍然感到朦胧。你说的对。所以看起来我需要让它们成为 NSObject 并使用 NSCopying? - 嗯。您即时更改了链接?
  • “Ehrm。你即时更改了链接” – 是的。
  • NSCopying 不是合适的工具。这是不安全的,因为它必须通过AnyObject 进行转换。 NSCopying 只能用于与 Cocoa 交互。正确的工具是实现init(copy:)

标签: swift clone subclass superclass


【解决方案1】:

你的意思是子类。 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 会让你犯这个错误并最终崩溃。

【讨论】:

  • 对不起,超级/子混淆(流感,见上面的评论 :-) Martin 的第一条评论把我带到了一些 NSObject 线程。后来他编辑了它,使它指向上面你自己的第一个链接(我同时阅读了)。感谢您花时间将其用于我的需要。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多