Я пытаюсь использовать новую функцию sealedSubclasses
в Kotlin на практике. Мне нужно обработать экземпляр некоторых подклассов из запечатанного класса, но я не знаю ранее, какой это подкласс, поэтому обычная процедура - попробовать все подклассы.
Предположим, что существует 20 или более подклассов.
Ниже я упростила это, чтобы было легко следовать. Я использовал только 2 подкласса со скалярными внутренними типами. В реальном мире могут быть сложные типы объектов.
sealed class Person {
abstract var name:String
// ...
}
data class Doctor(
var license: String = "",
// ....
override var name:String = ""
) : Person()
// ....
data class Fireman (
var medals: Int=0,
// ....
override var name:String = ""
) : Person()
Теперь мне нужно клонировать эту структуру: Сначала попробуйте:
var p:Person = Doctor("123","Louis")
var q:Person
// ...
Person.copy // it is forbidden
Итак, мне нужно сделать
var p:Person = Doctor("123","Louis")
var q:Person
when (p) {
is Doctor -> q = p.copy()
// ...
is Fireman -> q = p.copy()
}
Обратите внимание, что это плохой код,потому что всегда, что я добавляю новый подкласс, я должен добавить вручную в процессе клонирования, повторяя субблок.
Поэтому я пытаюсь использовать sealedSubclasses
, но мне не удалось соединить подкласс с типом для имитации предыдущего кода
for (subClass в Token :: class.sealedSubclasses) {if (ele :: class.simpleName as String == производное.qualifiedName) {// ?????? }}
Что я могу сделать?