Вам нужно добавить id
в ваш конструктор и передать его конструктору базового класса при расширении.
private data class Thing(
val name: String,
val desc: String,
val id: Long
) : EntityBase(id) {
companion object {
fun fromDto(dto: ThingDto) = Thing(
name = dto.name,
desc = dto.desc,
id = dto.id
)
}
}
Это то, что вы подразумеваете под "использованием конструкторов"? Если вы не хотите иметь конструкторы, вы должны использовать геттеры / сеттеры в вашем базовом классе ( NOTE Я бы не рекомендовал следующее, показанное для иллюстрации) -
class EntityBase {
private Long id;
public EntityBase() { }
public EntityBase(Long id) { this.id = id; }
public void setId(Long id) { this.id = id; }
public Long getId() { return id; }
}
Тогда вы можете сделать -
private data class Thing(
val name: String,
val desc: String
) : EntityBase() {
companion object {
fun fromDto(dto: ThingDto) : Thing {
val thing = Thing(
name = dto.name,
desc = dto.desc)
thing.id = dto.id;
return thing;
}
}
}
Тогда вы не связываете конструкторы, но это имеет большой недостаток - id
не является частью класса данных, toString
, copy
, equals
и т. Д. Будут генерироваться только со значениями в конструкторе класса data
. Если вы вызовете toString
для объекта, используя вышеуказанное, вы увидите, что он использует только name
и desc
.