Home > front end >  Make a class open, but internal
Make a class open, but internal

Time:10-13

I have a class:

internal class A {

}

I also have another class:

open class B: A {

}

I really need B to be open, but in order for this code to compile, I have to make A open, but making A open also makes it public and I don't want that.

Do you think if there's any way to make a class internal open?

CodePudding user response:

No, you can not, Swift doesn't support this scenario.

The design of the language involves making other overridable declarations in A to be visible in B in another module without explicitly redefining them. They need to be publicly visible/overrideable on A if they are to be visible on B and thus the entire class must be visible/overridable.

CodePudding user response:

This is probably the closest you can get to what you want:

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

Usage:

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

Unfortunately, there doesn't seem to be a way to have the init in B inherited, because then it must be in A. But you also can't mark the init in A as @available(*, unavailable), otherwise it is unavailable to B too.

  • Related