【问题标题】:Swift singleton subclass(inheritance)Swift 单例子类(继承)
【发布时间】:2017-08-15 15:24:33
【问题描述】:

我知道用swift写单例最简单的方法是

class A {
    static let shared = A()
    private init() { //... }
    func a() {}
}
// usage
A.shared.a()

问题是可以写一个A类的子类单例吗?

我从某人那里得到以下代码,通过类函数来完成

class A {
    class func shared() -> A {
        private struct _A {
            static let _shared = A()
        }
        return _A.shared
    }
    func a() { //... }
}
class B: A {
    class func shared() -> B {
        private struct _B {
            static let _shared = B()
        }
        return _B.shared
    }
    func b() { //... }
}
// usage
A.shared.a()
B.shared.b()

但问题是我不能在这里使用 private init() 来隐藏初始化,因为没有protected init() 可以这样做

有谁知道如何使用私有 init() 子类化单例类? 谢谢!

【问题讨论】:

  • 来自stackoverflow.com/questions/35865212/…“你永远不会继承单例。因为如果你继承它,那么它就不再是单例了”
  • 感谢@MartinR!因为我刚刚从 GoF Design Patterns 中阅读了单例模式,并且有一些关于在其他语言中子类化单例的内容,所以想知道我们可以在 Swift 中做到这一点
  • 为什么需要对单例进行子类化?迅速它没有意义
  • @SaiLi:你想达到什么目的?您读到了什么关于哪种语言的信息?
  • @Kingalione 只想快速实现书中的单例继承,想知道我是否可以快速实现,谢谢

标签: swift oop design-patterns singleton


【解决方案1】:

我不确定走这条路是个好主意。但是,如果必须,您可以将它们保存在同一个文件中并使用 fileprivate 来完成此操作。

在 A 类声明中:

fileprivate init() { }

在 B 类声明中:

override fileprivate init() { }

祝你好运!

【讨论】:

  • 但是如果它们是不同模块的一部分呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
相关资源
最近更新 更多