使用 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
不知道 B
和 C
引入的对项目类型的额外限制。因此,如果我们使用 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
]反对。
我有一个大致如下的设置(抱歉,如果 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
不知道 B
和 C
引入的对项目类型的额外限制。因此,如果我们使用 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
]反对。