Продукт DataCamp недавно выпустил свой первый курс по Scala: Введение в Scala. Заинтересуйтесь!
Вы также можете прочитать следующие руководства:
- Руководство для новичков по Scala
- IF ELSE в Scala
- Операторы в Scala
- Списки в Scala
- Классы и объекты в Scala
Введение
Трейт — это концепт, широко используемый в объектно-ориентированном программировании, который может расширить функциональность класса с помощью набора методов.
Тraits похожи в духе на интерфейсы в языке программирования Java. В отличие от класса, трейты Scala не могут быть инстанцированы и не имеют аргументов или параметров. Тем не менее, их можно наследовать (расширять) с помощью классов и объектов. Утверждая это, трейты предоставляют специфический набор методов/функций, которые выполняют поведение классу и ожидают, что класс реализует набор методов, которые затем параметризуют предоставляемое поведение.
Трейт, используемый для определения объекта, создается как смесь методов, которые могут использоваться различными классами без необходимости множественного наследования. Однако могут быть и исключения, когда два трейта имеют метод с одинаковым именем (конфликт именования), который должен использоваться классом, и в этом случае необходимо явно разрешить двусмысленность.
Трейты могут иметь как абстрактные, так и неабстрактные методы, поля как свои члены. Когда вы не инициализируете метод в трейте, он становится абстрактным, в то время как те, которые инициализируются, называются неабстрактными. В абстрактных методах класс, который реализует трейт, занимается инициализацией.
Теперь покрнее разберемся с трейтами Scala, воспользовавшись несколькими примерами!
Синтаксис трейта Scala
Синтаксис трейта Scala простой, он определяется ключевым словом trait
, за которым следует имя трейта.
trait Trait_Name{ // Переменные // Методы }

Как вы можете видеть из вышеуказанного определения характеристики, был определен класс называемый DataCamp
, который не содержит никаких переменных и методов.
Перейдем к простым примерам Scala traits, которые принесут вам больше ясности о том, как они работают программно.
Как было указано в представлении, Scala Traits импортируются классом с использованием ключевого слова extends
.
class Scala_Tutorial extends DataCamp{ // Переменные // Методы }
Definireм трейт с именем Scala_Course
, который будет наследоваться от класса DataCamp
. Внутри трейта мы определим абстрактный метод с именем scala()
, реализация которого будет происходить в классе DataCamp
.
trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def scala(){ println("DataCamp has recently launched there first Scala course") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.scala() } }
Теперь у нас есть код выше.

В приведенном выше примере метод scala()
был абстрактным, так что его декларация была сделана в классе, наследовавшем трейт.
Но что, если у вас уже есть метод (неабстрактный), реализованный в трейте?VM Well, в этом случае класс, который наследует этот трейт, не обязательно должен реализовывать метод, уже реализованный в трейте.
Поможем понять этому с помощью небольшого примера.
trait BMW{ // Trait переменные var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 // Trait метод: НЕ АБСТРACT def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } class Car extends BMW{ // Класс переменные var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 // Класс метод def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // Главный метод def main(args: Array[String]) { // Класс объект var obj = new Car(); println("Calling the Class Method") obj.Merc_Specs(); println("Calling the Trait Method") obj.Display(); } }
Давайте запустим вышедший код:

Теперь, когда вы поняли разница между абстрактным
и неабстрактным
методами, посмотрим, что может пойти не так, когда абстрактный
метод не реализуется в классе, который наследует
или расширяет
его.
Используем 同一 пример, чтобы понять этот принцип.
trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def print(){ println("Error: Class DataCamp needs to be Abstract") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.print() } }
Запуск вышедшего кода приводит к ошибке, как показано ниже, так как вы не определили тrait метод scala()
(абстрактный) в классе, который наследовал его.

Чтобы сделать вышедший код рабочим, могли быть две возможные решения:
- Определить
scala()
метод в классеDataCamp
или - Определить класс DataCamp как
абстрактный
.
Последний вопрос на сегодняшнем уроке – это то, как можно наследовать несколько тrait в одном классе. Так что быстро закончим его.
trait A{ // методы } trait B{ // методы } class C extends A with B{ }
trait BMW{ var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 } trait Merc{ var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 } class Car extends BMW with Merc{ def BMW_Specs() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // главный метод def main(args: Array[String]) { // класс объект var obj = new Car(); println("Calling the BMW Trait") obj.BMW_Specs(); println(); println("Calling the Merc Trait") obj.Merc_Specs(); } }
В конце концов, запустим вышеуказанный код.

Поздравляем!
Поздравляем с завершением этого учебника.
Теперь вы знаете, что такое Traits в программировании и как им использовать в Scala. Хорошая упражнения для вас будет найти решение для абстрактного метода, когда он не определен в классе, унаследованном ему. Попробуйте написать код для того же и посмотреть, сможет ли код запуститься без ошибок компиляции. Краткое советы, может быть удобно посмотреть на Abstract Classes в Scala.
Пожалуйста, не стесняйтесь задавать вопросы, связанные с этим учебником, в комментариях ниже.
В конце концов, не забудьте записаться на новый курс Scala на DataCamp, Введение в Scala.