【问题标题】: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,基类如何从具有派生类对象列表的派生类对基类对象列表进行操作?
【发布时间】:2021-09-13 10:46:56
【问题描述】:

我有一个模糊的设置,如下所示(如果 Kotlin/伪语法令人困惑,请告诉我,我会更改它)。
我有两个派生类,它们包含其项目是派生类实例的列表。列表基类具有列表的通用功能。
我只是想知道我这样做的方式是否愚蠢。在基类中使用派生类列表 (List, List) 是否有比为列表 (List) 添加另一个属性并在每次对列表进行更改时在派生类中更新它更好的方法?
我有点想在基类 A 中声明“项目”列表属性,然后用 B 和 C 中的派生类型覆盖。使用类 A 中的方法使用列表转换为泛型基类 (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 {
    ...
}

【问题讨论】:

  • 很遗憾你没有尝试将你的伪代码重写为 Kotlin,因为那样你会发现你可以用你的代码来实现这一点:-) 为什么你认为这是不可能的?
  • 另外,您是否需要直接或仅在派生类中修改A 中的项目列表?在后一种情况下,您实际上可以只使用一个属性,而无需任何同步。
  • 哈哈,我是这样做的,只是觉得可能有更好的方法!有一个与另一个属性相同的附加属性似乎有点奇怪,只是转换为它的基类,并且每当你更改原始属性时都需要更新
  • A 中至少有一种方法可以修改列表。在特定索引处删除。感谢您的帮助:)

标签: list kotlin inheritance covariance declare


【解决方案1】:

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

在您的情况下,您似乎只需要读取/删除 A 中的项目。这要简单得多,不需要任何解决方法。拥有一个常规的、单一的属性并在子类中覆盖它的类型就足够了。但是我们需要通知编译器我们永远不会在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对象。

【讨论】:

  • 非常感谢,这似乎正是我所需要的。将我指向这篇文章proandroiddev.com/…,以防其他人想了解更多信息
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 2015-05-23
  • 1970-01-01
相关资源
最近更新 更多