Взломайте код — познакомьтесь с чертами в Scala.
В этом блоге мы знакомимся с особенностями в Scala и пытаемся собрать некоторые знания о том, как реализовать их в коде. Мы поймем эту черту лучше, сравнив ее с такими функциями языка Java, как интерфейсы и абстрактные классы.
Вам также может понравиться: Черты Scala: давайте немного перепутаем
Введение в черты
Черты в Scala имеют много общего с интерфейсами в Java, но черта является более мощной, чем интерфейс, потому что она позволяет разработчикам реализовывать членов внутри него. Черта представляет собой сочетание абстрактных и неабстрактных методов. Черта не может быть реализована, поэтому она не имеет параметров. Черта может быть расширена другими чертами, абстрактными классами, конкретными классами, а также классами case.
Определение черты выглядит как определение класса с ключевым словом «черта».
Синтаксис:
Scala
xxxxxxxxxx
1
trait Trait_Name{
2
//Fields
3
//Methods
4
}
Например:
Scala
xxxxxxxxxx
1
trait Calculator{
2
def doAddition(num1:Int,num2:Int) = {
3
num1+num2
4
}
5
def doSubtraction(num1:Int,num2:Int)
6
}
В данном примере признак Calculator
определяется с помощью конкретного метода doAddition
и абстрактного метода doSubtraction
.
Как только черта определена, она может быть смешана в классе с помощью extends
или with
ключевых слов.
Scala
1
class CalculatorOperation extends Calculator {
2
def doSubtraction(num1:Int,num2:Int):Int = {
3
num1-num2}
4
}
После этого вы можете вызывать методы в trait и class, создавая объект класса CalculatorOperation
в объекте singleton или в методе main.
Наследование с использованием признака
Поскольку интерфейсы в Java используются для получения множественного наследования, аналогично, черты используются для достижения множественного наследования в Scala. Когда класс наследует несколько признаков, мы используем ключевое слово extends перед первым признаком, а после этого используем ключевое слово with перед другими признаками. Черты могут быть использованы для достижения множественного наследования в Scala, поэтому проблема Алмаза множественного наследования решается путем линеаризации с использованием черт.
Синтаксис:
Scala
xxxxxxxxxx
1
Class Class_Name extends TraitName-1 with TaitName-2 with TraitName-3{
2
//Body of Class
3
}
Например:
Scala
xxxxxxxxxx
1
trait A
2
{
3
def printMassage() { println("In trait A") }
4
}
5
trait B extends A {
6
override def printMassage() { println("In trait B") }
7
}
8
trait C extends A {
9
override def printMassage() { println("In trait C") }
10
}
11
class Alphabet extends C with B with A
13
object Alphabet extends App{
15
val obj =new Alphabet
16
obj.printMassage() }
Выход: в черте B
Диаграмма: Иерархия наследования и линеаризация класса Alphabet
:
Теперь мы увидим различия между абстрактными классами и признаками:
Черта характера |
Абстрактный класс |
Черты не имеют конструктора. |
Абстрактный класс содержит конструктор |
Класс может расширять несколько черт. |
Класс может расширять только один абстрактный класс. |
Черта может быть добавлена к экземпляру объекта. |
Мы не можем добавить абстрактный класс к экземпляру объекта. |
Заключение
В этом блоге мы узнали о базовой реализации признаков и о том, как они работают в нескольких идиомах. Вы видели, что черты похожи на интерфейсы, а также абстрактные классы, и черты более гибкие и мощные, чем они оба. Надеемся, что вы узнали некоторые основы одного из наиболее часто используемых строительных блоков в Scala OOP.
Спасибо за прочтение!