Introducció

En aquest tema, explorarem dos conceptes fonamentals de la programació orientada a objectes en Scala: les classes abstractes i les classes case. Les classes abstractes ens permeten definir estructures generals que poden ser especialitzades per altres classes, mentre que les classes case proporcionen una manera concisa i poderosa de definir classes que són principalment contenidors de dades.

Classes Abstractes

Què és una Classe Abstracta?

Una classe abstracta és una classe que no es pot instanciar directament. Serveix com a plantilla per a altres classes que poden heretar-ne les propietats i mètodes. Les classes abstractes poden contenir mètodes abstractes (sense implementació) i mètodes concrets (amb implementació).

Definició d'una Classe Abstracta

abstract class Animal {
  def makeSound(): String // Mètode abstracte
  def sleep(): Unit = println("Zzz...") // Mètode concret
}

Herència d'una Classe Abstracta

class Dog extends Animal {
  def makeSound(): String = "Woof!"
}

class Cat extends Animal {
  def makeSound(): String = "Meow!"
}

Exemple Pràctic

object AbstractClassExample extends App {
  val dog = new Dog
  val cat = new Cat

  println(dog.makeSound()) // Woof!
  println(cat.makeSound()) // Meow!
  dog.sleep() // Zzz...
  cat.sleep() // Zzz...
}

Exercici Pràctic

Exercici 1: Defineix una classe abstracta Vehicle amb un mètode abstracte move() i un mètode concret stop(). Crea dues subclasses Car i Bike que implementin el mètode move().

abstract class Vehicle {
  def move(): String
  def stop(): Unit = println("Vehicle stopped")
}

class Car extends Vehicle {
  def move(): String = "Car is moving"
}

class Bike extends Vehicle {
  def move(): String = "Bike is moving"
}

object VehicleExample extends App {
  val car = new Car
  val bike = new Bike

  println(car.move()) // Car is moving
  println(bike.move()) // Bike is moving
  car.stop() // Vehicle stopped
  bike.stop() // Vehicle stopped
}

Classes Case

Què és una Classe Case?

Les classes case són una característica especial de Scala que facilita la creació de classes que són principalment contenidors de dades. Proporcionen implementacions automàtiques de mètodes com equals, hashCode, i toString, i suporten la descomposició mitjançant coincidència de patrons.

Definició d'una Classe Case

case class Person(name: String, age: Int)

Creació i Utilització d'Instàncies

val person1 = Person("Alice", 30)
val person2 = Person("Bob", 25)

println(person1.name) // Alice
println(person2.age) // 25

Comparació i Còpia

val person3 = Person("Alice", 30)
println(person1 == person3) // true

val person4 = person1.copy(age = 31)
println(person4) // Person(Alice,31)

Exemple Pràctic

object CaseClassExample extends App {
  val person1 = Person("Alice", 30)
  val person2 = Person("Bob", 25)
  val person3 = Person("Alice", 30)

  println(person1 == person3) // true
  println(person1 == person2) // false

  val person4 = person1.copy(age = 31)
  println(person4) // Person(Alice,31)
}

Exercici Pràctic

Exercici 2: Defineix una classe case Book amb els camps title i author. Crea instàncies de Book i utilitza els mètodes copy i equals.

case class Book(title: String, author: String)

object BookExample extends App {
  val book1 = Book("1984", "George Orwell")
  val book2 = Book("Brave New World", "Aldous Huxley")
  val book3 = Book("1984", "George Orwell")

  println(book1 == book3) // true
  println(book1 == book2) // false

  val book4 = book1.copy(title = "Animal Farm")
  println(book4) // Book(Animal Farm,George Orwell)
}

Resum

En aquesta secció, hem après sobre les classes abstractes i les classes case en Scala. Les classes abstractes ens permeten definir estructures generals que poden ser especialitzades per altres classes, mentre que les classes case proporcionen una manera concisa i poderosa de definir classes que són principalment contenidors de dades. Hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. En el proper tema, explorarem els objectes companys en Scala.

© Copyright 2024. Tots els drets reservats