定义不带继承的公共属性

时间:2017-12-19 06:58:18

标签: kotlin

有没有一种方法可以在Kotlin中使用继承来定义公共属性?

例如

如果我有两个类都需要“id”属性。

class Dog() {
  var id: UUID?
}

class Cat() {
  var id: UUID?
}

解决这个问题的一般JAVA方法是引入超类

class Animal() {
  var id: UUID?
}
class Dog: Animal()
class Cat: Animal()

但现在“狗”和“猫”属于“动物”类型。如果我引入一个也需要唯一标识符的“主席”类,该怎么办?

基本上我想要创建一组属性的能力我可以包含在许多不同的类中,仅用于编程方便。我不想要与继承相关的所有问题。

3 个答案:

答案 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属性统一处理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

答案 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属性而避免使用超类,这样可以在需要时扩展其他类
  • 使用interface,它可以保证您的班级具有id
  • 的其他代码段
  • 允许将属性(或函数)的实现移动到单独的类,因此在复杂的属性/函数实现时不需要重复的代码
  • 允许在单独的类中实现多个属性/函数

答案 2 :(得分:0)

如评论中所述:

interface Animal {
    var id: UUID?
}
class Dog: Animal
class Cat: Animal