使用 Kotlin,基 class 如何从其派生 class 对基 class 对象列表进行操作,派生 class 具有派生 class 对象列表?

Using Kotlin how can a base class operate on a list of base class objects, from its derived class which has a list of derived class objects?

我有一个大致如下的设置(抱歉,如果 Kotlin/pseudo 语法令人困惑,请告诉我,我会更改它)。
我有两个派生的 classes,它们包含列表,其项目是派生的 class 个实例。其中列表基础 classes 具有列表的通用功能。
我只是想知道我这样做的方式是否愚蠢。有没有更好的方法在基础 class 中使用派生的 class 列表 (List, List) 而不是为列表 (List) 添加另一个 属性 并在派生的 [=] 中更新它22=] 每次对列表进行更改?
我有点想在基础 class A 中声明 'items' 列表 属性,然后在 B 和 C 中用派生类型覆盖。使用 class A 中的方法使用转换为通用基础 class (List) 的列表。但你不能那样做。 干杯,希望有人对此感兴趣。

class A {
    val genericItems = List<a>

    methodForGenericItems() {
        do something generic with/to the list
    }
}

class B : A {
    val items = List<b>

    updateItems() {
        update items
        genericItems = items as List<a>
    }

    methodForDerivedItems() {
        do something specific using the list
        call methodForGenericItems()
    }
}

class C : A {
    val items = List<c>

    updateItems() {
        update items
        genericItems = items as List<a>
    }

    methodForDerivedItems() {
        do something specific using the list
        call methodForGenericItems()
    }
}

class a {
    ...
}

class b : a {
    ...
}

class c : a {
    ...
}

这实际上取决于我们是否需要在基础 class (A) 中添加新项目。如果我们需要这样做,那么我们就有问题了,因为 A 不知道 BC 引入的对项目类型的额外限制。因此,如果我们使用 B class 与 b 项目一起使用,但是 A 的功能之一添加了 c 类型的项目怎么办?我们将有一个 b 项目的列表,但包含 c 这会破坏类型安全。这个问题有一些解决办法,看具体需要。

在您的情况下,您似乎只需要 read/remove A 中的项目。这要简单得多,不需要任何解决方法。有一个常规的、单一的 属性 并在 subclass 中覆盖它的类型就足够了。但是我们需要通知编译器我们永远不会在 A 中添加新项目。我们可以这样做:

open class A {
    open val items: MutableList<out a> = mutableListOf()
}

class B : A() {
    override val items = mutableListOf<b>()
}
这段代码中的

out a表示A只能从items“拉”a个对象,但不能“推”a ]反对。