【问题标题】:Make a class open, but internal使课程开放,但内部
【发布时间】:2021-12-01 12:03:38
【问题描述】:

我有一堂课:

internal class A {

}

我还有一门课:

open class B: A {

}

我真的需要B 成为open,但是为了编译这段代码,我必须打开A,但是打开A open 也使它成为public 而我没有不想那样。

你觉得有什么办法可以让internal open上课吗?

【问题讨论】:

  • 也许使用protocol 一致性和组合或委托
  • 是的……真是个泡菜……
  • @IsaaсWeisberg 你可以创建Apublic,并添加一个internal init,然后添加一个public 一个标记为不可用。那么A是可见的,但是不能从外部创建它的实例。
  • @George 哦,这是一个解决方案,谢谢
  • 虽然我赞成你自己的答案 - 你有没有机会在你的问题中提供更多细节?严重的是,它缺少为什么需要这种类型的代码设计。

标签: swift class inheritance module access-modifiers


【解决方案1】:

不,你不能,Swift 不支持这种情况。

该语言的设计涉及使A 中的其他可覆盖声明在另一个模块中的B 中可见,而无需显式重新定义它们。如果要在 B 上可见,它们需要在 A 上公开可见/可覆盖,因此整个类必须可见/可覆盖。

【讨论】:

    【解决方案2】:

    这可能是你能得到的最接近你想要的东西:

    open class A {
        public let message: String
    
        fileprivate init(message: String) {
            self.message = message
        }
    }
    
    open class B: A {
        public override init(message: String) {
            super.init(message: message)
        }
    
        public func printMessage() {
            print(message)
        }
    }
    

    用法:

    let b = B(message: "Hello world!")
    b.printMessage()
    

    不幸的是,似乎没有办法继承B 中的init,因为它必须在A 中。但也不能将A中的init标记为@available(*, unavailable),否则B也无法使用。

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 2015-12-13
      • 2011-05-04
      • 2019-05-26
      • 2010-10-02
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      相关资源
      最近更新 更多