使 class 打开,但内部
Make a class open, but internal
我有一个 class:
internal class A {
}
我还有一个class:
open class B: A {
}
我真的需要 B
变成 open
,但是为了编译这段代码,我必须打开 A
,但是让 A
open
也成为 public
但我不想要那样。
你觉得有什么方法可以制作classinternal open
吗?
不可以,Swift不支持这种场景。
语言的设计涉及使 A
中的其他可覆盖声明在另一个模块的 B
中可见,而无需显式重新定义它们。如果它们要在 B
上可见,它们需要在 A
上公开 visible/overrideable,因此整个 class 必须是 visible/overridable。
这可能是最接近您想要的:
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
也无法使用。
我有一个 class:
internal class A {
}
我还有一个class:
open class B: A {
}
我真的需要 B
变成 open
,但是为了编译这段代码,我必须打开 A
,但是让 A
open
也成为 public
但我不想要那样。
你觉得有什么方法可以制作classinternal open
吗?
不可以,Swift不支持这种场景。
语言的设计涉及使 A
中的其他可覆盖声明在另一个模块的 B
中可见,而无需显式重新定义它们。如果它们要在 B
上可见,它们需要在 A
上公开 visible/overrideable,因此整个 class 必须是 visible/overridable。
这可能是最接近您想要的:
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
也无法使用。