Делегирование класса в Kotlin
Делегирование класса - когда ваш тип хранит другой объект и перенаправляет ему вызовы. Это композиция: вместо наследования всего родителя вы собираете поведение из готовых кусков. Каждый кусок - отдельный экземпляр с явной ссылкой.
Пусть форматирование текста вынесено в класс
Formatter, а Report только хранит данные
и просит форматтер оформить строку:
class Formatter {
fun title(text: String): String =
"=== $text ==="
}
class Report(val headline: String) {
private val formatter = Formatter()
fun printTitle() {
println(formatter.title(headline))
}
}
fun main() {
Report("sales").printTitle()
}
Объект formatter можно передать в конструктор -
тогда один и тот же форматтер обслужит несколько
отчётов или его подменят в тестах:
class Report(
val headline: String,
private val formatter: Formatter,
) {
fun printTitle() {
println(formatter.title(headline))
}
}
Такой объект-исполнитель часто реализует интерфейс.
Тогда список методов можно не переписывать вручную -
следующий урок покажет запись : Interface by obj.
Объявите class Counter с полем value
и методом inc(). Объявите class Stats,
который в конструкторе принимает Counter
и методом show() выводит текущее value
счётчика.
Создайте Counter(5), передайте его в
Stats, вызовите inc() у счётчика
и затем show() у статистики.