我有一個大致如下的設定(如果Kotlin/pseudo的語法讓人困惑,請告訴我,我會改的)。 我有兩個派生類,用于保存串列,其專案是派生類實體。串列基類對串列具有通用功能。 我只是想知道我這樣做是不是很傻。是否有更好的方法在基類中使用派生類的串列(List, List),而不是為串列(List)添加另一個屬性,并在每次對串列進行更改時在派生類中更新它? 我想在基類A中宣告'items'串列屬性,然后在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() {
更新專案
genericItems = items as List<a>
}
methodForDerivedItems() {
do something specific using the list
呼叫 methodForGenericItems()
}
}
class C : A {
val items = List<c>
updateItems() {
更新專案
genericItems = items as List<a>
}
methodForDerivedItems() {
do something specific using the list
呼叫 methodForGenericItems()
}
}
class a{
...
}
class b : a {
...
}
class c : a { ...
...
uj5u.com熱心網友回復:
這真的取決于我們是否需要在基類(A)中添加新的專案。如果我們需要這樣做,那么我們就有一個問題,因為A不知道由B和C引入的關于專案型別的額外限制。因此,如果我們使用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物件 "推 "給它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/320064.html
標籤:
上一篇:基類的公共函式在派生類中不可用,因為派生類有受保護的訪問指定。
下一篇:為什么在Python的派生類中,super().__init__()的行為與super().override()的行為不同?
