【问题标题】:Swift. Use extended property type in subclass迅速。在子类中使用扩展属性类型
【发布时间】:2016-09-07 12:27:36
【问题描述】:

我需要子类中的扩展属性,但这段代码无法编译。

protocol A {
}
protocol B: A {
}
protocol C: A {
}

class Base {
    var presenter: A?
}
class Left: Base {
    override var presenter: B?
}
class Right: Base {
    override var presenter: C?
}

如何在 Swift 2 上实现这一点?

【问题讨论】:

  • 这是不可能的,因为您会更改超类的合同。这看起来像是一个架构问题,应该可以通过泛型、关联类型或更好的整体设计来解决。
  • 我只是不想让超类知道子类的细节。为什么这是一个架构问题?现在我在每个子类中转换这个属性。
  • 你正在尝试做的事情有很多问题 - read-write properties are invariant & protocols don't conform to themselves。正如 Sulthan 所说,您将不得不重新考虑您的设计。你的实际用例是什么?

标签: swift class inheritance protocols


【解决方案1】:

您不能在 swift 中覆盖或更改属性类型,但强制转换可能会对您有所帮助。例如,检查此代码中的 Left 类:

protocol A {
}
protocol B: A {
}
protocol C: A {
}

class Base {
    var presenter: A?
}


class Left: Base {

    init(persenter : B?) {
        self.presenter = presenter
    }

    func test() {
        print(presenter as! B)
    }
}

class Right: Base {
    var presenter: C?  //WON'T COMPILE
}

【讨论】:

  • 谢谢,我创建了一个新的惰性属性并在那里投射演示者。我希望超类对这个属性的子类细节一无所知。这是一个糟糕的设计还是 swift 的功能?
  • 在我看来这不是一个糟糕的设计,只是你不能在声明后更改变量类型,这在类型化语言中是有意义的。而且超类对子类的细节一无所知,只是它包含一个名为 Presenter 的属性,并且它符合名为 A 的协议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多