В этой главе рассказывается, как использовать классы и объекты в программировании Scala. Класс — это план для объектов. Определив класс, вы можете создавать объекты из чертежа класса с ключевым словом new . Через объект вы можете использовать все функциональные возможности определенного класса.
Следующая диаграмма демонстрирует класс и объект на примере ученика класса, который содержит переменные-члены (name и roll no) и методы-члены (setName () и setRollNo ()). Наконец все являются членами класса. Класс — это синяя печать, а объекты здесь реальны. На следующей диаграмме ученик — это класс, а Харини, Джон и Мария — объекты ученического класса, у которых есть имя и номер броска.
Базовый класс
Ниже приведен простой синтаксис для определения базового класса в Scala. Этот класс определяет две переменные x и y и метод: move , который не возвращает значение. Переменные класса называются, поля класса и методы называются методами класса.
Имя класса работает как конструктор класса, который может принимать несколько параметров. Приведенный выше код определяет два аргумента конструктора, xc и yc ; они оба видны во всем теле класса.
Синтаксис
class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } }
Как упоминалось ранее в этой главе, вы можете создавать объекты, используя ключевое слово new, а затем вы можете получить доступ к полям и методам класса, как показано ниже в примере:
пример
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } } object Demo { def main(args: Array[String]) { val pt = new Point(10, 20); // Move to a new location pt.move(10, 10); } }
Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.
команда
\>scalac Demo.scala \>scala Demo
Выход
Point x location : 20 Point y location : 30
Расширение класса
Вы можете расширить базовый класс Scala и создать унаследованный класс так же, как вы делаете это в Java (используйте ключевое слово extends ), но есть два ограничения: переопределение метода требует ключевого слова override , и только первичный конструктор может передать параметры для базового конструктора. Давайте расширим наш класс и добавим еще один метод класса.
пример
Давайте возьмем пример из двух классов. Класс Point (такой же пример, как и выше) и класс Location наследуются классом с использованием ключевого слова extends. Такое предложение extends имеет два эффекта: оно делает класс Location наследующим все не приватные члены класса Point и делает тип Location подтипом класса Point . Так что здесь класс Point называется суперклассом, а класс Location называется подклассом . Расширение класса и наследование всех функций родительского класса называется наследованием, но Scala позволяет наследовать только от одного класса.
Примечание. Методы метода move () в классе Point и метода move () в классе Location не переопределяют соответствующие определения move, поскольку они являются разными определениями (например, первые принимают два аргумента, а последние принимают три аргумента).
Попробуйте следующий пример программы для реализации наследования.
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy println ("Point x location : " + x); println ("Point y location : " + y); } } class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ var z: Int = zc def move(dx: Int, dy: Int, dz: Int) { x = x + dx y = y + dy z = z + dz println ("Point x location : " + x); println ("Point y location : " + y); println ("Point z location : " + z); } } object Demo { def main(args: Array[String]) { val loc = new Location(10, 20, 15); // Move to a new location loc.move(10, 10, 5); } }
Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.
команда
\>scalac Demo.scala \>scala Demo
Выход
Point x location : 20 Point y location : 30 Point z location : 20
Неявные классы
Неявные классы позволяют неявные разговоры с основным конструктором класса, когда класс находится в области видимости. Неявный класс — это класс, помеченный ключевым словом «неявный». Эта функция представлена в Scala 2.10.
Синтаксис . Ниже приводится синтаксис неявных классов. Здесь неявный класс всегда находится в области объекта, где разрешены все определения методов, потому что неявный класс не может быть классом верхнего уровня.
Синтаксис
object <object name> { implicit class <class name>(<Variable>: Data type) { def <method>(): Unit = } }
пример
Давайте возьмем пример неявного класса с именем IntTimes с помощью метода times (). Это означает, что times () содержит транзакцию цикла, которая будет выполнять данный оператор столько раз, сколько мы даем. Предположим, что данный оператор «4 раза println (« Hello »)» означает, что оператор println («Hello») будет выполнен 4 раза.
Ниже приведена программа для данного примера. В этом примере используются два класса объектов (Run и Demo), поэтому мы должны сохранить эти два класса в разных файлах с соответствующими именами, как показано ниже.
Run.scala — сохраните следующую программу в Run.scala.
object Run { implicit class IntTimes(x: Int) { def times [A](f: =>A): Unit = { def loop(current: Int): Unit = if(current > 0){ f loop(current - 1) } loop(x) } } }
Demo.scala — Сохраните следующую программу в Demo.scala.
import Run._ object Demo { def main(args: Array[String]) { 4 times println("hello") } }
Следующие команды используются для компиляции и выполнения этих двух программ.
команда
\>scalac Run.scala \>scalac Demo.scala \>scala Demo
Выход
Hello Hello Hello Hello
Примечание —
-
Неявные классы должны быть определены внутри другого класса / объекта / признака (не на верхнем уровне).
-
Неявные классы могут принимать только один неявный аргумент в своем конструкторе.
-
Неявные классы не могут быть любым методом, членом или объектом в области с тем же именем, что и неявный класс.
Неявные классы должны быть определены внутри другого класса / объекта / признака (не на верхнем уровне).
Неявные классы могут принимать только один неявный аргумент в своем конструкторе.
Неявные классы не могут быть любым методом, членом или объектом в области с тем же именем, что и неявный класс.
Одиночные объекты
Scala более объектно-ориентирован, чем Java, потому что в Scala у нас не может быть статических членов. Вместо этого в Scala есть одноэлементные объекты . Singleton — это класс, который может иметь только один экземпляр, т.е. Object. Вы создаете синглтон, используя ключевое слово object вместо ключевого слова class. Поскольку вы не можете создать экземпляр одноэлементного объекта, вы не можете передать параметры первичному конструктору. Вы уже видели все примеры с использованием одноэлементных объектов, где вы вызывали основной метод Scala.
Ниже приведен тот же пример программы для реализации синглтона.
пример
import java.io._ class Point(val xc: Int, val yc: Int) { var x: Int = xc var y: Int = yc def move(dx: Int, dy: Int) { x = x + dx y = y + dy } } object Demo { def main(args: Array[String]) { val point = new Point(10, 20) printPoint def printPoint{ println ("Point x location : " + point.x); println ("Point y location : " + point.y); } } }
Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.