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

Classe e Objeto do Scala

A classe é a abstração do objeto, e o objeto é o exemplo específico da classe. A classe é abstrata, não ocupa memória, enquanto o objeto é específico, ocupa espaço de armazenamento. A classe é o esboço usado para criar objetos, é um modelo de software que define métodos e variáveis incluídos em um tipo específico de objeto.

Podemos usar a palavra-chave new para criar objetos da classe, exemplo a seguir:}}

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("Coordenadas do ponto x: " + x);
      println("Coordenadas do ponto y: " + y);
   }
}

As classes no Scala não são declaradas como public, um arquivo-fonte Scala pode conter várias classes.

A definição da classe do exemplo acima define duas variáveis x e y Método:moveMétodos não têm valor de retorno.

A definição de classe do Scala pode ter parâmetros, chamados de parâmetros de classe, como xc, yc acima, os parâmetros de classe podem ser acessados em todo o escopo da classe.

A seguir, podemos usar new para instanciar a classe e acessar os métodos e variáveis da classe:

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("Coordenadas do ponto x: " + x);
      println("Coordenadas do ponto y: " + y);
   }
}
object Test {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);
      // mover-se para uma nova posição
      pt.move(10, 10);
   }
}

Execute o código acima e o resultado será:

$ scalac Test.scala 
$ scala Test
Coordenadas do ponto x: 20
Coordenadas do ponto y: 30

Herança do Scala

A herança do Scala é semelhante ao Java, mas precisamos prestar atenção aos seguintes pontos:

  • 1Para sobrescrever um método não abstrato, é necessário usar o modificador override.

  • 2Apenas o construtor principal pode passar parâmetros para o construtor da classe pai.

  • 3Na subclasse, ao sobrescrever o método abstrato da superclasse, você não precisa usar a palavra-chave override.

Vamos ver um exemplo a seguir:

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("Coordenadas do ponto x: " + x);
      println("Coordenadas do ponto 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("Ponto de coordenada x: "); + x);
      println("Ponto de coordenada y: "); + y);
      println("Coordenadas do ponto z : " + z);
   }
}

O Scala usa a palavra-chave extends para herdar uma classe. No exemplo, a classe Location herda a classe Point. Point é chamada de classe pai (classe base), Location é chamada de subclasse.

override val xc Para sobrescrever os campos da classe pai.

A herança herda todas as propriedades e métodos da classe pai, o Scala permite apenas a herança de uma classe pai.

Exemplo a seguir:

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("Ponto de coordenada x: "); + x);
      println("Ponto de coordenada 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("Ponto de coordenada x: "); + x);
      println("Ponto de coordenada y: "); + y);
      println("Coordenadas do ponto z : " + z);
   }
}
object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);
      // mover-se para uma nova posição
      loc.move(10, 10, 5);
   }
}

Execute o código acima e o resultado será:

$ scalac Test.scala 
$ scala Test
Ponto de coordenada x: 20
Ponto de coordenada y: 30
Coordenadas do ponto z : 20

O Scala reescreve um método não abstrato, deve usar o modificador 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)
}

Execute o código acima e o resultado será:

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

Objeto singleton no Scala

No Scala, não há essa coisa chamada static, mas também fornece um método de implementação do padrão singleton, que é o uso da palavra-chave object.

No Scala, ao usar o padrão singleton, além da classe definida, também é necessário definir um objeto object com o mesmo nome, a diferença é que o objeto object não pode ter parâmetros.

Quando um objeto singleton compartilha o mesmo nome com uma classe, ele é chamado de objeto anexado dessa classe: object companion. Você deve definir a classe e seu objeto anexado no mesmo arquivo de origem. A classe é chamada de classe companion do objeto singleton: class companion. A classe e seu objeto anexado podem acessar os membros privados um do outro.

Exemplo de objeto singleton

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("Ponto de coordenada x: "); + point.x);
         println("Ponto de coordenada y: "); + point.y);
      }
   }
}

Execute o código acima e o resultado será:

$ scalac Test.scala 
$ scala Test
Ponto de coordenada x: 10
Ponto de coordenada y: 20

Exemplo de objeto anexado

/* Nome do arquivo: Marker.scala
 * autor: Site deTutorial Básico
 * url:pt.oldtoolbag.com
 */
// Construtor privado
class Marker private(val color: String) {}}
  println("Criar" + this)
  
  override def toString(): String = "Marcador de Cor:"+ color
  
}
// Objeto anexado, com o mesmo nome da classe, pode acessar propriedades e métodos privados da classe
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"))  
        // Chamada de função singleton, omitindo o símbolo (ponto) .  
                println(Marker getMarker "blue")  
    }
}

Execute o código acima e o resultado será:

$ scalac Marker.scala 
$ scala Marker
Criar Marcador de Cor: vermelho
Criar Marcador de Cor: azul
Criar Marcador de Cor: verde
Marcador de Cor: vermelho
Marcador de Cor: azul