- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个封闭的类宇宙,其中每个子类都是某个外部类的内部类。我想我可以使用密封内部类作为层次结构的基础,如下所示:
class Outer {
fun foo(): Int {
// ...
}
inner sealed class InnerBase(val i: Int) {
fun sharedFunctionality() {
println(foo() + i)
}
abstract fun doIt()
inner class Inner1: InnerBase(1) {
override fun doIt() {
blah()
sharedFunctionality()
bloo()
}
}
}
}
请注意
Outer
是一个适当的类,它可以有许多不同的实例。每个实例都应该能够创建 Inner1
来调用正确的 foo
InnerBase
子类的范围是有限的InnerBase
有一些实例方法,供各种 Inner
子类使用,它访问 Outer
的非静态方法 foo
InnerBase
的具体子类(例如 Inner1
)将参数传递给 InnerBase
的构造函数但是,这样做的问题是我不知道如何在 Outer
中构造 Inner1
类型的值。我希望这会起作用:
class Outer { // continued from above
fun someMethod() {
val x: InnerBase = InnerBase.Inner1()
}
}
但是失败了
src/InnerSealed.kt:14:27: error: unresolved reference: Inner1
val x : InnerBase = InnerBase.Inner1()
^
我猜问题是 Inner1
实际上是 Inner
的内部类,所以在我之前需要一个 Inner
的实例可以构造一个 Inner1
的实例。然而,这不是我想要的;我希望 Inner
只是我的 Inner1
等类的基类,具有一些在所有子类之间共享并访问 Outer
的功能code> 的实例数据。
我发现的一个解决方法是使 InnerBase
成为非密封
:
class Outer {
fun foo(): Int {
// ...
}
inner abstract class InnerBase(val i: Int) {
fun sharedFunctionality() {
println(foo() + i)
}
abstract fun doIt()
}
inner class Inner1: InnerBase(1) {
override fun doIt() {
sharedFunctionality()
}
}
fun someMethod() {
val x : InnerBase = Inner1()
}
}
但是 InnerBase
的子类不再封闭。
最佳答案
如果我理解正确的话,您不需要 Outer
实例,而是需要存储“static
”foo
的地方。那么你需要 object
,而不是 class
。
我用 object Outer
替换了 class Outer
并删除了 sealed
:
object Outer {
var foo = 42
sealed class Inner(val i: Int) {
init {
println(foo + i)
}
class Inner1: Inner(1)
}
init {
val x: Inner = Inner.Inner1()
}
}
关于java - 密封内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40690937/
当数据类扩展包含非抽象 open val 属性的密封类时,生成的子数据类包含与父类的私有(private)字段重复的私有(private)字段。 sealed class Foo(open val f
当封装一个.jar 文件(整个.jar,而不是特定的包)时,实际上封装了哪些包?它只是包含.class 文件的包,还是还包含父包和子包? 举个例子,假设我有一个包含单个 .class 文件 com.c
我可以很容易地为这样的密封案例类族一般派生一个编解码器: import io.circe._ import io.circe.generic.auto._ sealed trait Base case
我有一个类层次结构: class C1 { virtual object M1(); } class C2: C1 { override sealed object M1(); } class C3:
有什么区别: type MovieType = {| +blob?: string, +name: string, +url?: string |}; 和 type MovieType =
想象一个这样的 secret : apiVersion: v1 kind: Secret metadata: name: {{ include "test-cicd.fullname" . }}
因此,我的一位开发人员使用这样的函数为 Magento 电子商务网站制作自定义导航: getUrl() ?>">__('about') ?> 唯一的问题是它的输出如下: about 据我了解,如果同时
我是一名优秀的程序员,十分优秀!