Большую часть времени, когда я пишу код, я использую Java. Так что это мой основной язык программирования. Это удовлетворяет меня во всех аспектах, но я замечаю, что Java иногда слишком многословна. Вот почему я перешел на Scala. Поэтому все свободное время я трачу сейчас на изучение Scala. Я собираюсь опубликовать некоторые заметки в своем блоге, поэтому вы можете посетить новую страницу моего блога, которая будет посвящена Scala. Первая серьезная статья будет о Scala OOP.
Объявление класса
ООП в Scala позволяет создавать классы. Но процесс объявления отличается от Java. Вот как мы можем сделать это в Scala:
1
|
class Person |
Ничего сложного. И это не странно, мы просто объявили совершенно бесполезным занятие. Давайте продолжим, чтобы посмотреть, как мы можем обновить код, чтобы сделать его более практичным.
Первичный конструктор
Я собираюсь добавить некоторые параметры в класс Person, которые необходимо указать при создании объекта. Как многие из вас могут догадаться, я говорю о первичном конструкторе :
1
|
class Person(name : String, age : Int) |
Первичный конструктор может быть вызван напрямую, когда мы создаем объект. Вот пример:
1
|
val p1 = new Person( "Alex" , 24 ) |
А также это может быть вызвано косвенно в перегруженном конструкторе. Перегрузка вне темы, и я буду обсуждать это в следующих постах.
Параметры с префиксом конструктора
Хорошо, мы уже объявили класс Person и, похоже, он может быть более или менее полезным, поскольку в нем есть некоторые параметры инициализации, переданные в первичном конструкторе. Но как мы можем взаимодействовать с этими параметрами после инициализации?
1
2
3
|
scala> p 1 .name <console> : 10 : error : value name is not a member of Person p 1 .name |
Как видите, попытка доступа к параметру name класса экземпляра Person приводит к ошибке. Это связано с тем, что параметр name не имеет префикса в объявлении основного конструктора . Следовательно, параметры name и age объявлены как private и недоступны вне класса Person .
1
|
class Person(val name: String, var age: Int) |
Я изменил объявление класса Person. Теперь параметр name будет поставляться с геттером, потому что он имеет префикс val , а параметр age будет поставляться с сеттером в дополнение к сеттеру, потому что он имеет префикс var .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
scala> val p 2 = new Person( "Bobby" , 25 ) p 2 : Person = Person @ 30374534 scala> p 2 .name res 1 : String = Bobby scala> p 2 .name = "Bob" <console> : 9 : error : reassignment to val p 2 .name = "Bob" scala> p 2 .age res 2 : Int = 25 scala> p 2 .age = 26 p 2 .age : Int = 26 |
С помощью префиксов val и var внутри основного конструктора вы можете сделать классы более практичными.
Тело класса
Давайте двигаться дальше с основами ООП в Scala. Теперь я хочу показать, как классы Scala могут быть более практичными, если они содержат некоторые дополнительные функции внутри тела класса.
1
2
3
4
|
class Person( val name : String, var age : Int) { def introduce() = println(s "Hi, my name is ${name}, I'm ${age} years old" ) } |
Теперь экземпляр класса Person стал более социальным, и он (она) может представиться кому-то. Попробуйте код:
1
2
|
val p3 = new Person( "Jhon" , 33) p3.introduce |
Резюме
Хорошо в посте я попытался сделать обзор самых простых и важных основ Scala OOP. По моему мнению, Scala OOP является более сложным, чем Java OOP. Может быть, даже не более сложный, но он другой и определенно требует некоторого времени, чтобы привыкнуть к нему.