хочу создать его класс-наследник архив, куда будут передаваться разные файлы
class Archive(name: String, var files: List<File>): File(name, ???)
для создания File мне нужно заранее знать его размер, и я могу это подсчитать в момент инициализации, к примеру с помощью функции
fun calc_size(): Int{
var sum = 0
for (f in files)
sum += f.size
return sum
}
как это реализовать, что подставить вместо ???
Ну, если у вас функция для подсчёта будет не внутри класса, то можно просто её спокойно вызвать (но тогда список файлов надо в неё явно передать) Альтернативно можно немного изменить структуру, чтобы не надо было завязываться на то, что потенциально подсчитываемый параметр надо было передавать в конструктор. Например в таком случае может быть абстрактный класс файла, а обычный файл или архив - это уже его наследники. Примеры всего: fun main() { val file1 = File("abc", 4) val file2 = File("cde", 2) val archive1 = Archive("def", listOf(file1, file2)) val file3 = File("qwe", 6) val archive2 = Archive("asd", listOf(file3, archive1)) println(archive2.size) val altFile1 = SimpleFile("abc", 4) val altFile2 = SimpleFile("cde", 2) val altArchive1 = ArchiveFile("def", listOf(altFile1, altFile2)) val altFile3 = SimpleFile("qwe", 6) val altArchive2 = ArchiveFile("asd", listOf(altFile3, altArchive1)) println(altArchive2.size) } open class File(val name: String, val size: Int) class Archive(name: String, val files: List<File>): File(name, calculateSize(files)) fun calculateSize(files: List<File>) = files.sumBy { it.size } sealed class AltFile { abstract val name: String abstract val size: Int } class SimpleFile(override val name: String, override val size: Int): AltFile() class ArchiveFile(override val name: String, val files: List<AltFile>): AltFile() { override val size by lazy { files.sumBy { it.size } } }
Спасибо за подробный ответ
Обсуждают сегодня