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 ответов

7 просмотров

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

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

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

Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
А чем вам питонисты не угодили?😂
.
79
Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
Всем здравствуйте! Я хотел узнать сколько стоит средняя месячная зарплата у Electron js разработчиков? Мне очень это важно и нужно, плиз помогите узнать эту инфу! Для Джунио...
U.K.
10
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
77
А дин типизация это хорошо или плохо?
Alexey
12
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Исходники плюс документация? Вы гоните)) демок хватит всем
zamtmn
11
Карта сайта