@Parcelize注释与继承

时间:2018-01-04 14:31:37

标签: android kotlin parcelable

我无法使用@parcelize注释创建通用结构。 我希望构造函数可以用作Jason,Room和Parcelable的构造函数。

让我们假设我们有班级

@Parcelize
class Food(var taste: String = "")

现在我首先想到两个解决方案

1.抱怨味道必须是var或val,以获得可用的Parceable构造函数

@Parcelize
class FastFood(var callory:String = "", taste: String): Food(taste) // error

2.抱怨我必须明确地品尝味道 - 那么多态性有什么好处呢?

@Parcelize
class FastFood(var callory: String = "", var taste: String): Food(taste) // error

如何与图书馆一起有效地使用继承?

2 个答案:

答案 0 :(得分:2)

如果你在构造函数中添加了值,那么在Kotlin中就可以使用' val'或者' var'它变成了阶级财产。要使用Parceable,您需要添加它,因为没有它Parcelable.Creator无法访问它。然后你需要添加' open'改变食物类和物质的味道'因为在Kotlin默认情况下都是最终版,所以你可以覆盖品味值。

@Parcelize
open class Food(open val taste: String)

@Parcelize
class FastFood(var callory:String = "", override val taste: String): Food(taste)

答案 1 :(得分:0)

我无法使用@Parcelize找到完美的解决方案,但是有两种稍微有缺陷的方法。

1)使基类成为抽象,并且仅在子代中使用@Parcelize。这意味着您不能拥有父实例,但是有时候很好。如果您负担得起的话,这是一个有效的解决方案。

abstract class Food : Parcelable {
    abstract var taste: String
}

@Parcelize
class FastFood(var callory: String = "", override var taste: String = "") : Food()

2)也许您需要能够创建父实例。一种方法是使基类不是父类,而是父类和子类的父类。不幸的是,这有点混乱了类的层次结构,而FastFood将不是一种食物,而是两者都将是BaseFood。

abstract class BaseFood : Parcelable {
    abstract var taste: String
}

@Parcelize
class Food(override var taste: String = "") : BaseFood()

@Parcelize
class FastFood(var callory: String = "", override var taste: String = "") : BaseFood()