В данной статье мы рассмотрим классы и объекты в языке программирования 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.
В следующей статье мы рассмотрим модификаторы доступа в данном языке программирования.