Scala - Classes e objetos
Este capítulo mostra como usar classes e objetos na programação Scala. Uma classe é um projeto para objetos. Depois de definir uma classe, você pode criar objetos a partir do blueprint da classe com a palavra-chavenew. Através do objeto você pode utilizar todas as funcionalidades da classe definida.
O diagrama a seguir demonstra a classe e o objeto tomando um exemplo de classe aluno, que contém as variáveis de membro (nome e número de rolagem) e métodos de membro (setName () e setRollNo ()). Finalmente, todos são membros da classe. A classe é uma planta e os objetos são reais aqui. No diagrama a seguir, Aluno é uma classe e Harini, John e Maria são os objetos da classe Aluno, que têm nome e número de rolagem.
Aula Básica
A seguir está uma sintaxe simples para definir uma classe básica em Scala. Esta classe define duas variáveisx e y e um método: move, que não retorna um valor. Variáveis de classe são chamadas, campos da classe e métodos são chamados métodos de classe.
O nome da classe funciona como um construtor de classe que pode receber vários parâmetros. O código acima define dois argumentos do construtor,xc e yc; ambos são visíveis em todo o corpo da classe.
Sintaxe
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);
}
}
Conforme mencionado anteriormente neste capítulo, você pode criar objetos usando uma palavra-chave new e então você pode acessar os campos de classe e métodos como mostrado abaixo no exemplo -
Exemplo
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);
}
}
Salve o programa acima em Demo.scala. Os seguintes comandos são usados para compilar e executar este programa.
Comando
\>scalac Demo.scala
\>scala Demo
Resultado
Point x location : 20
Point y location : 30
Estendendo uma aula
Você pode estender uma classe base Scala e projetar uma classe herdada da mesma maneira que você faz em Java (use extends palavra-chave), mas há duas restrições: a substituição do método requer o override palavra-chave, e apenas a primaryO construtor pode passar parâmetros para o construtor base. Vamos estender nossa classe acima e adicionar mais um método de classe.
Exemplo
Vamos dar um exemplo de duas classes classe Point (como o mesmo exemplo acima) e a classe Location é uma classe herdada usando a palavra-chave extends. Tal um 'extendsA cláusula 'tem dois efeitos: faz com que a classe Location herde todos os membros não privados da classe Point e torna o tipo Location um subtipo da classe Point de tipo . Então aqui a classe Point é chamadasuperclasse a classe Location é chamadasubclass. Estender uma classe e herdar todos os recursos de uma classe pai é chamadoinheritance mas Scala permite a herança de apenas uma classe apenas.
Note - Métodos move () método na classe Point e move() method in Location class não substitua as definições correspondentes de movimento, uma vez que são definições diferentes (por exemplo, a primeira leva dois argumentos, enquanto a última leva três argumentos).
Experimente o programa de exemplo a seguir para implementar a herança.
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);
}
}
Salve o programa acima em Demo.scala. Os seguintes comandos são usados para compilar e executar este programa.
Comando
\>scalac Demo.scala
\>scala Demo
Resultado
Point x location : 20
Point y location : 30
Point z location : 20
Classes implícitas
As classes implícitas permitem conversas implícitas com o construtor primário da classe quando a classe está no escopo. Classe implícita é uma classe marcada com a palavra-chave 'implícita'. Este recurso foi introduzido no Scala 2.10.
Syntax- A seguir está a sintaxe para classes implícitas. Aqui, a classe implícita está sempre no escopo do objeto, onde todas as definições de método são permitidas porque a classe implícita não pode ser uma classe de nível superior.
Sintaxe
object <object name> {
implicit class <class name>(<Variable>: Data type) {
def <method>(): Unit =
}
}
Exemplo
Vamos dar um exemplo de uma classe implícita chamada IntTimescom o método times (). Significa que times () contém uma transação de loop que irá executar a instrução dada no número de vezes que damos. Vamos supor que a instrução fornecida seja “4 vezes println (“ Hello ”)” significa que a instrução println (“” Hello ”) será executada 4 vezes.
A seguir está o programa para o exemplo fornecido. Neste exemplo, duas classes de objetos são usadas (Run e Demo) para que tenhamos que salvar essas duas classes em arquivos diferentes com seus respectivos nomes, como segue.
Run.scala - Salve o seguinte programa em 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 - Salve o seguinte programa em Demo.scala.
import Run._
object Demo {
def main(args: Array[String]) {
4 times println("hello")
}
}
Os comandos a seguir são usados para compilar e executar esses dois programas.
Comando
\>scalac Run.scala
\>scalac Demo.scala
\>scala Demo
Resultado
Hello
Hello
Hello
Hello
Note -
As classes implícitas devem ser definidas dentro de outra classe / objeto / característica (não no nível superior).
Classes implícitas podem ter apenas um argumento não-implícito em seu construtor.
As classes implícitas não podem ser nenhum método, membro ou objeto no escopo com o mesmo nome da classe implícita.
Objetos Singleton
Scala é mais orientado a objetos do que Java porque em Scala não podemos ter membros estáticos. Em vez disso, Scala temsingleton objects. Um singleton é uma classe que pode ter apenas uma instância, ou seja, Object. Você cria singleton usando a palavra-chaveobjectem vez da palavra-chave class. Como você não pode instanciar um objeto singleton, não pode passar parâmetros para o construtor primário. Você já viu todos os exemplos de objetos singleton nos quais chamou o método principal do Scala.
A seguir está o mesmo programa de exemplo para implementar o singleton.
Exemplo
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);
}
}
}
Salve o programa acima em Demo.scala. Os seguintes comandos são usados para compilar e executar este programa.
Comando
\>scalac Demo.scala
\>scala Demo
Resultado
Point x location : 10
Point y location : 20