gpt4 book ai didi

kotlin - 为什么密封类的私有(private)构造函数可以在子类中调用?

转载 作者:行者123 更新时间:2023-12-05 00:11:08 25 4
gpt4 key购买 nike

Sealed class in Kotlin可以有private仅构造函数。这意味着我们只能调用构造函数本身:

Sealed classes are not allowed to have non-private constructors (their constructors are private by default).


// `private` and `constructor()` are redundant.
sealed class Expr private constructor()

但是,当我们使用密封类时,子类必须继承密封类:
// Above Kotlin 1.1
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()

可以看到上面的代码,sealed 类的 private构造函数在密封类本身之外调用。子类实例化时,先调用父类(密封类)的构造函数,再调用子类自己的构造函数。它只是可见性修饰符的异常(exception)吗?

https://kotlinlang.org/docs/reference/visibility-modifiers.html#classes-and-interfaces

For members declared inside a class: private means visible inside this class only (including all its members);

最佳答案

考虑以下代码:

open class A private constructor(var name: String){
class B : A("B")
class C : A("C")
}

上面的代码编译得很好,因为在类 A 中调用了构造函数。
如果类 D 试图继承 A 之外,它将无法编译。
class D : A("D") // Error: Cannot access '<init>': it is private in 'A'

如页面 Sealed class in Kotlin 中所述,

A sealed class can have subclasses, but all of them must be declared in the same file as the sealed class itself. (Before Kotlin 1.1, the rules were even more strict: classes had to be nested inside the declaration of the sealed class).



似乎 kotlin 只放宽了嵌套类的要求。

因此,以下代码在 1.1+ 中可以正常工作,但在早期版本中会失败:
sealed class A(var name: String)
class B : A("B")
class C : A("C")

而在 1.1 之前的版本中将需要以下代码,它尊重私有(private)构造函数。
sealed class A (var name: String){
class B : A("B")
class C : A("C")
}

因此,允许在类之外(但在同一个文件中)密封类的私有(private)构造函数可以被认为是使代码更清晰的增强。

关于kotlin - 为什么密封类的私有(private)构造函数可以在子类中调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54613891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com