Большую часть времени, когда я пишу код, я использую 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> p1.name<console>:10: error: value name is not a member of Person p1.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 p2 = new Person("Bobby", 25)p2: Person = Person@30374534scala> p2.nameres1: String = Bobbyscala> p2.name = "Bob"<console>:9: error: reassignment to val p2.name = "Bob"scala> p2.ageres2: Int = 25scala> p2.age = 26p2.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. Может быть, даже не более сложный, но он другой и определенно требует некоторого времени, чтобы привыкнуть к нему.