Методы расширения
Основная цель методов расширения (extension methods) -
позволить добавлять новые функциональные возможности в закрытые классы.
Представим, что у нас есть класс Circle
, но мы не можем изменить его исходный код.
Например, он может быть определен следующим образом в сторонней библиотеке:
case class Circle(x: Double, y: Double, radius: Double)
Если необходимо добавить методы в этот класс, можно их определить как методы расширения, например:
extension (c: Circle)
def circumference: Double = c.radius * math.Pi * 2
def diameter: Double = c.radius * 2
def area: Double = math.Pi * c.radius * c.radius
Ключевое слово extension
объявляет о намерении определить один или несколько методов расширения для параметра,
заключенного в круглые скобки.
Как показано в примере выше, параметры типа Circle
затем могут быть использованы в теле методов расширения.
Теперь, если есть экземпляр Circle
с именем aCircle
, можно вызвать эти методы следующим образом:
val aCircle = Circle(0.0, 0.0, 1.0)
aCircle.circumference
// res0: Double = 6.283185307179586
aCircle.diameter
// res1: Double = 2.0
aCircle.area
// res2: Double = 3.141592653589793
Более подробно методы расширения раскрыты в соответствующей главе раздела "Абстракции".
Ссылки: