Принцип Открытого Закрытия и Функции Расширения - PullRequest
2 голосов
/ 13 марта 2019

Я узнал, что принцип Open Close позволяет расширять классы и ограничивать его модификацию. Так в Kotlin, когда мы используем функцию расширения

  1. Расширяем ли мы класс
  2. Или мы модифицируем класс
  3. Могут ли функции расширения в kotlin быть примером принципа открытия / закрытия?

Я предполагаю, что средства расширения применяют средства наследования и модификации для добавления или изменения кода существующего класса.

Спасибо

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Функция расширения предназначена для ситуаций, когда вы хотите добавить функцию во встроенный или сторонний класс.Вы не можете сделать это по умолчанию, потому что встроенные функции не могут быть изменены.

Пример реализации для добавления метода toUnsigned во встроенный класс Byte:

fun Byte.toUnsigned(): Int {
    return if (this < 0) this + 256 else this.toInt()
}

Поскольку Byte являетсявстроенный класс, вы не можете изменить его напрямую.Однако вы можете определить функцию расширения согласно приведенному выше коду.Затем вы можете вызвать функцию расширения следующим образом:

val x: Byte = -1
println(x.toUnsigned()) // Prints 255

Имейте в виду, что это просто синтаксический сахар - вы на самом деле не изменяете класс или его экземпляры.Следовательно, вам необходимо импортировать функцию / свойство расширения везде, где вы хотите ее использовать (поскольку оно не переносится вместе с экземплярами класса).

Источник: https://kotlinlang.org/docs/tutorials/kotlin-for-py/extension-functionsproperties.html

1 голос
/ 14 марта 2019

«Расширение» в контексте открытого закрытого принципа обычно не означает наследование, это означает как-то расширение класса новыми функциями.«Модификация» относится к изменению кода класса, как вы говорите.

Средство расширения Kotlin позволяет вам добавлять метод к классу, не редактируя код класса.Это полностью соответствует принципу Open Closed - класс расширен новыми функциональными возможностями без изменения самого класса.

...