有没有一种方法可以在 Kotlin 中不使用继承来定义公共属性?
例如
如果我有两个类都需要“id”属性。
class Dog() {
var id: UUID?
}
class Cat() {
var id: UUID?
}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的一般JAVA方法是引入一个超类
class Animal() {
var id: UUID?
}
class Dog: Animal()
class Cat: Animal()
Run Code Online (Sandbox Code Playgroud)
但现在“Dog”和“Cat”的类型是“Animal”。如果我引入一个也需要唯一标识符的“Chair”类怎么办?
本质上,我想要创建一组属性的能力,我可以将其包含在许多不同的类中,只是为了方便编程。我不希望出现与继承相关的所有问题。
当然,您可以使用 aninterface代替基类:
interface HasId {
val id: UUID
}
data class Dog(override val id: UUID) : HasId
data class Cat(override val id: UUID) : HasId
Run Code Online (Sandbox Code Playgroud)
不过,上面仍然使用了继承。如果您有在多个类中使用的更常见的属性,则可能表明它们应该分组在一起以形成单独的值对象,例如
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)
Run Code Online (Sandbox Code Playgroud)
如果你想统一对待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
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的:
interface Animal {
var id: UUID?
}
class Dog: Animal
class Cat: Animal
Run Code Online (Sandbox Code Playgroud)