有没有一种方法可以在Kotlin中使用继承来定义公共属性?
例如
如果我有两个类都需要“id”属性。
class Dog() {
var id: UUID?
}
class Cat() {
var id: UUID?
}
解决这个问题的一般JAVA方法是引入超类
class Animal() {
var id: UUID?
}
class Dog: Animal()
class Cat: Animal()
但现在“狗”和“猫”属于“动物”类型。如果我引入一个也需要唯一标识符的“主席”类,该怎么办?
基本上我想要创建一组属性的能力我可以包含在许多不同的类中,仅用于编程方便。我不想要与继承相关的所有问题。
答案 0 :(得分:1)
当然,您可以使用interface
而不是基类:
interface HasId {
val id: UUID
}
data class Dog(override val id: UUID) : HasId
data class Cat(override val id: UUID) : HasId
但是,上面仍然使用继承。如果您有更多可在多个类中使用的公共属性,则可能表示它们应组合在一起以形成单独的值对象,例如。
data class Address(val city: String, val street: String, val country: String)
class Person(val name: String, val address: Address)
class School(val name: String, val address: Address, val studentsCount: Int)
如果您想对Person
属性统一处理School
和address
,您仍然可以使用该界面来表示公共属性:
interface HasAddress {
val address: Address
}
class Person(val name: String,
override val address: Address) : HasAddress
class School(val name: String,
override val address: Address,
val studentsCount: Int) : HasAddress
答案 1 :(得分:1)
代表团可能会满足您的需求:
interface WithId {
var id: Int
}
class IdStorage : WithId {
override var id: Int = 0
}
class Dog(withId: WithId) : WithId by withId {
constructor() : this(IdStorage()) {}
}
class Cat(withId: WithId) : WithId by withId {
constructor() : this(IdStorage()) {}
}
这段代码相当冗长,但它允许你做的是:
id
属性而避免使用超类,这样可以在需要时扩展其他类id
答案 2 :(得分:0)
如评论中所述:
interface Animal {
var id: UUID?
}
class Dog: Animal
class Cat: Animal