定义公共属性而不继承

jax*_*jax 7 kotlin

有没有一种方法可以在 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”类怎么办?

本质上,我想要创建一组属性的能力,我可以将其包含在许多不同的类中,只是为了方便编程。我不希望出现与继承相关的所有问题。

mie*_*sol 5

当然,您可以使用 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属性Schooladdress你仍然可以使用接口来表示公共属性:

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)


vod*_*dan 0

正如评论中提到的:

interface Animal {
    var id: UUID?
}
class Dog: Animal
class Cat: Animal
Run Code Online (Sandbox Code Playgroud)