169 похожих чатов

Есть класс open class File(var name: String, var size: Int) я

хочу создать его класс-наследник архив, куда будут передаваться разные файлы
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
}
как это реализовать, что подставить вместо ???

2 ответов

15 просмотров

Ну, если у вас функция для подсчёта будет не внутри класса, то можно просто её спокойно вызвать (но тогда список файлов надо в неё явно передать) Альтернативно можно немного изменить структуру, чтобы не надо было завязываться на то, что потенциально подсчитываемый параметр надо было передавать в конструктор. Например в таком случае может быть абстрактный класс файла, а обычный файл или архив - это уже его наследники. Примеры всего: 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 } } }

Dr.-Alan Автор вопроса

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта