Руководство по Scala. Классы и объекты.

В данной статье мы рассмотрим классы и объекты в языке программирования Scala.

Класс является шаблоном для объектов. Когда мы создали класс, мы получаем возможность создавать его экземпляры с помощью ключевого слова new. Данный экземпляр (объект) имеет все свойства и методы, которые имеет класс.


Класс

Предположим, что у нас есть класс Developer, который имеет следующий вид:


package net.proselyte.scalatutorial.classes

/**
  * Simple class that represents a Developer.
  *
  * @author Eugene Suleimanov
  */

class Developer(val name: String, val specialty: String) {
  var developerName: String = name;
  var developerSpecialty = specialty;

  def writeCode() {
    println(this.developerSpecialty + " writes code.");
  }
}

И клиентский класс DeveloperDemo, который выглядит следующим образом:


package net.proselyte.scalatutorial.classes

/**
  * Demo object that demonstrates work of class Developer.
  *
  * @author Eugene Suleimanov
  */


object DeveloperDemo {
  def main(args: Array[String]) {
    val javaScalaDeveloper = new Developer("Eugene Suleimanov", "Java/Scala Developer");


    println("Developer name: " + javaScalaDeveloper.developerName);
    println("Developer specialty: " + javaScalaDeveloper.developerSpecialty);
    javaScalaDeveloper.writeCode();
  }
}

В результате выполнения DeveloperDemo, мы получим следующий результат:


Developer name: Eugene Suleimanov
Developer specialty: Java/Scala Developer
Java/Scala Developer writes code.

Process finished with exit code 0

Наследование
Как и во всех других ООП языках программирования, в Scala поддерживается механизм наследования. Для этого используется ключевое слово extends, как и в языка Java.
Но, в Scala есть два ограничения:

  • Только первичный конструктор может передавать параметры в базовый конструктор
  • Переопределение метода требует использования ключевого слова override.

Для понимания того, как это работает на практике, рассмотрим простой пример:

Предположим, что у нас есть класс Program и есть класс, который является его наследником SecuredProgam.

Класс Program:


package net.proselyte.scalatutorial.classes

/**
  * Simple class that represents a Program
  *
  * @author Eugene Suleimanov
  */

class Program(val name: String) {

  var programName: String = name;

  def startWork() {
    println("Hello, I'm a simple program. My name is: " + this.name);
  }
}

Класс SecuredProgram


package net.proselyte.scalatutorial.classes

/**
  * Secured program that extends class Program.
  *
  * @author Eugene Suleimanov
  */

class SecuredProgram(override val name: String, val securityCertificate: String) extends Program(name) {
  override def startWork() {
    println("Hello, I'm a secured program. My name is: " + this.name);
    println("I have security certificate: " + this.securityCertificate);
  }
}

Объект ProgramDemo


package net.proselyte.scalatutorial.classes

/**
  * Client class that demonstrates work of classes Program and SecuredProgram.
  *
  * @author Eugene Suleimanov
  */

object ProgramDemo {
  def main(args: Array[String]) {
    var program = new Program("Simple Program");
    program.startWork();

    var securedProgram = new SecuredProgram("Secured Program", "Security Certificate");
    securedProgram.startWork();
  }
}

В результате выполнения данной программы мы получим, примерно, следующий результат:


Hello, I'm a simple program. My name is: Simple Program
Hello, I'm a secured program. My name is: Secured Program
I have security certificate: Security Certificate

Process finished with exit code 0

Скрытые классы

Скрытые классы – это классы, которые позволяют нам неявное обращение к первичному конструктору, если класс находится в области его видимости.

Для создания неявного класса используется ключевое слово implicit.

При работе со скрытыми классами стоит учитывать следующее:

  • Скрытые классы должны быть объявлены внутри другого класса, объекта или трейта.
  • Скрытый класс может принимать только один не скрытый аргумент и конструктор.

Рассмотрим простой пример:

Предположим, что у нас есть следующие классы:

Squaring:


package net.proselyte.scalatutorial.classes

/**
  * Simple object that provides multiplication.
  *
  * @author Eugene Suleimanov
  */

object Squaring {

  implicit class Squarer(x: Int) {
    def numberSquaring[A](f: => A): Unit = {
      println(x + " * " + x + " = " + x * x);
    }
  }
}

и

SquaringDemo:


package net.proselyte.scalatutorial.classes

import Squaring._

/**
  * Client object that demonstrates work of Squaring object.
  *
  * @author Eugene Suleimanov
  */

object SquaringDemo {
  def main(args: Array[String]) {
    100 numberSquaring();
  }
}

В результате выполнения программы, мы получим, примерно, следующий результат:


100 * 100 = 10000

Process finished with exit code 0

Одиночные объекты (Singleton)

В отличие от Java, в Scala мы не можем иметь статические сущности. Это связано с тем, что Scala является более объектно-ориентированным языком программирования.

Вместо статических объектов, в данном языке программирования мы используем одиночные объекты (singleton objects).
Мы создаём объект с помощью ключевого слова object. После того как мы создали данный объект, мы не можем передавать параметры в конструктор.

Все демонстрационные классы в данной статье (*Demo) были именно одиночными объектами.
Класс

Предположим, что у нас есть класс Developer, который имеет следующий вид:


package net.proselyte.scalatutorial.classes

/**
  * Simple class that represents a Developer.
  *
  * @author Eugene Suleimanov
  */

class Developer(val name: String, val specialty: String) {
  var developerName: String = name;
  var developerSpecialty = specialty;

  def writeCode() {
    println(this.developerSpecialty + " writes code.");
  }
}

И клиентский класс DeveloperDemo, который выглядит следующим образом:


package net.proselyte.scalatutorial.classes

/**
  * Demo object that demonstrates work of class Developer.
  *
  * @author Eugene Suleimanov
  */


object DeveloperDemo {
  def main(args: Array[String]) {
    val javaScalaDeveloper = new Developer("Eugene Suleimanov", "Java/Scala Developer");


    println("Developer name: " + javaScalaDeveloper.developerName);
    println("Developer specialty: " + javaScalaDeveloper.developerSpecialty);
    javaScalaDeveloper.writeCode();
  }
}

В результате выполнения DeveloperDemo, мы получим следующий результат:


Developer name: Eugene Suleimanov
Developer specialty: Java/Scala Developer
Java/Scala Developer writes code.

Process finished with exit code 0

На этом мы заканчиваем обзор классов и объектов в Scala.
В следующей статье мы рассмотрим модификаторы доступа в данном языке программирования.