English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Классы и объекты в Scala

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

Мы можем использовать ключевое слово new для создания объектов класса, пример приведен ниже:

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("координата x: " + x);
      println("координата y: " + y);
   }
}

В Scala классы не объявляются как public, в одном файле может быть несколько классов.

В примере выше класс определяет две переменные x и y Метод:moveМетод не возвращает значения.

Определение класса в Scala может иметь параметры, называемые параметрами класса, например, xc, yc, которые доступны во всем классе.

Затем мы можем использовать new для создания экземпляра класса и доступа к методам и переменным класса:

import java.io._
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("координата x: " + x);
      println("координата y: " + y);
   }
}
object Test {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);
      // Переместиться в новую позицию
      pt.move(10, 10);
   }
}

Выполните приведенный выше код, результат вывода будет:

$ scalac Test.scala 
$ scala Test
координата x: 20
координата y: 30

Scala inheritance

Scala inheritance, но需要注意以下几点:

  • 1. Для перегрузки неабстрактного метода необходимо использовать модификатор override.

  • 2. Лишь в главном конструкторе можно передавать параметры в конструктор базового класса.

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

Давайте посмотрим на пример:

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("координата x: " + x);
      println("координата y: " + 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("координата x: " + x);
      println("координата y: " + y);
      println("координата z: " + z);
   }
}

Scala использует ключевое слово extends для наследования класса. В примере класс Location наследует класс Point. Point называется родительским классом (базовым классом), а Location - подклассом.

override val xc перегружает поле родительского класса.

Инheritance наследует все свойства и методы родительского класса, 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
      println("координата x: " + x);
      println("координата y: " + 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("координата x: " + x);
      println("координата y: " + y);
      println("координата z: " + z);
   }
}
object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);
      // Переместиться в новую позицию
      loc.move(10, 10, 5);
   }
}

Выполните приведенный выше код, результат вывода будет:

$ scalac Test.scala 
$ scala Test
координата x: 20
координата y: 30
координата z: 20

В Scala для перегрузки неабстрактного метода необходимо использовать модификатор override.

class Person {
  var name = ""
  override def toString = getClass.getName + "[name=" + name + "]"
}
class Employee extends Person {
  var salary = 0.0
  override def toString = super.toString + "[salary=" + salary + "]"
}
object Test extends App {
  val fred = new Employee
  fred.name = "Fred"
  fred.salary = 50000
  println(fred)
}

Выполните приведенный выше код, результат вывода будет:

$ scalac Test.scala 
$ scala Test
Employee[name=Fred][salary=50000.0]

Scala singleton object

In Scala, there is no such thing as static, but it also provides us with a way to implement the singleton pattern, which is to use the keyword object.

In Scala, when using the singleton pattern, in addition to defining the class, you also need to define an object with the same name, the difference being that the object cannot have parameters.

When a singleton object shares the same name with a class, it is called the companion object of this class: companion object. You must define the class and its companion object in the same source file. The class is called the companion class of this singleton object: companion class. The class and its companion object can access each other's private members.

companion object example

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 Test {
   def main(args: Array[String]) {
      val point = new Point(10, 20)
      printPoint
      def printPoint{
         println("x coordinate point: " + point.x);
         println("y coordinate point: " + point.y);
      }
   }
}

Выполните приведенный выше код, результат вывода будет:

$ scalac Test.scala 
$ scala Test
x coordinate point: 10
y coordinate point: 20

companion object example

/* file name: Marker.scala
 * author:基础教程网
 * url:ru.oldtoolbag.com
 */
// private constructor
class Marker private(val color: String) {
  println("Создать " + this)}
  
  override def toString(): String = "Цветовая метка: " + color
  
}
// Соседний объект, имеющий такое же имя, как и класс, может доступ к частным свойствам и методам класса
object Marker{
  
    private val markers: Map[String, Marker] = Map(
      "red" -> new Marker("red"),
      "blue" -> new Marker("blue"),
      "green" -> new Marker("green")
    )
    
    def apply(color: String) = {
      if(markers.contains(color)) markers(color) else null
    }
  
    
    def getMarker(color: String) = { 
      if(markers.contains(color)) markers(color) else null
    }
    def main(args: Array[String]) { 
        println(Marker("red"))  
        // Вызов функции-singleton, опущен символ.(точка)  
                println(Marker getMarker "blue")  
    }
}

Выполните приведенный выше код, результат вывода будет:

$ scalac Маркер.scala 
$ scala Маркер
Создать цветовую метку: красный
Создать цветовую метку: синий
Создать цветовую метку: зеленый
Цветовая метка: красный
Цветовая метка: синий