En aquest tema, explorarem dos conceptes fonamentals de la programació orientada a objectes en Scala: l'herència i els traits. Aquests conceptes permeten la reutilització de codi i la creació de jerarquies de classes més flexibles i modulars.
- Herència en Scala
L'herència és un mecanisme que permet a una classe derivar-se d'una altra classe, heretant-ne els camps i mètodes. Això facilita la reutilització de codi i la creació de jerarquies de classes.
1.1. Definició de Classes Base i Derivades
En Scala, una classe base es defineix de manera similar a altres llenguatges orientats a objectes. Una classe derivada s'especifica utilitzant la paraula clau extends.
// Definició de la classe base
class Animal {
def makeSound(): Unit = {
println("Some generic animal sound")
}
}
// Definició de la classe derivada
class Dog extends Animal {
override def makeSound(): Unit = {
println("Bark")
}
}
// Exemple d'ús
val myDog = new Dog()
myDog.makeSound() // Output: Bark1.2. Sobreescriptura de Mètodes
En Scala, els mètodes de la classe base poden ser sobreescrits a la classe derivada utilitzant la paraula clau override.
class Cat extends Animal {
override def makeSound(): Unit = {
println("Meow")
}
}
val myCat = new Cat()
myCat.makeSound() // Output: Meow1.3. Constructors i Herència
Els constructors de la classe base poden ser invocats des de la classe derivada utilitzant la sintaxi de constructors.
class Animal(val name: String) {
def makeSound(): Unit = {
println(s"$name makes a sound")
}
}
class Bird(name: String) extends Animal(name) {
override def makeSound(): Unit = {
println(s"$name chirps")
}
}
val myBird = new Bird("Parrot")
myBird.makeSound() // Output: Parrot chirps
- Traits en Scala
Els traits són una característica poderosa de Scala que permet la reutilització de codi de manera més flexible que les classes abstractes. Un trait és similar a una interfície en altres llenguatges, però pot contenir implementacions de mètodes.
2.1. Definició de Traits
Un trait es defineix utilitzant la paraula clau trait.
trait Swimmable {
def swim(): Unit = {
println("Swimming")
}
}
class Fish extends Swimmable
val myFish = new Fish()
myFish.swim() // Output: Swimming2.2. Implementació de Múltiples Traits
Una classe pot implementar múltiples traits utilitzant la paraula clau with.
trait Flyable {
def fly(): Unit = {
println("Flying")
}
}
class Duck extends Swimmable with Flyable
val myDuck = new Duck()
myDuck.swim() // Output: Swimming
myDuck.fly() // Output: Flying2.3. Sobreescriptura de Mètodes en Traits
Els mètodes dels traits poden ser sobreescrits de manera similar als mètodes de les classes.
trait Runnable {
def run(): Unit = {
println("Running")
}
}
class Cheetah extends Runnable {
override def run(): Unit = {
println("Running fast")
}
}
val myCheetah = new Cheetah()
myCheetah.run() // Output: Running fastExercicis Pràctics
Exercici 1: Herència Bàsica
Crea una classe base Vehicle amb un mètode move(). Després, crea una classe derivada Car que sobreescrigui el mètode move() per imprimir "Driving".
class Vehicle {
def move(): Unit = {
println("Moving")
}
}
class Car extends Vehicle {
override def move(): Unit = {
println("Driving")
}
}
val myCar = new Car()
myCar.move() // Output: DrivingExercici 2: Implementació de Traits
Defineix dos traits, Flyable i Swimmable, cadascun amb un mètode corresponent. Crea una classe Duck que implementi ambdós traits i crida els mètodes fly() i swim().
trait Flyable {
def fly(): Unit = {
println("Flying")
}
}
trait Swimmable {
def swim(): Unit = {
println("Swimming")
}
}
class Duck extends Flyable with Swimmable
val myDuck = new Duck()
myDuck.fly() // Output: Flying
myDuck.swim() // Output: SwimmingResum
En aquest tema, hem après sobre l'herència i els traits en Scala. Hem vist com les classes poden heretar d'altres classes, com sobreescriure mètodes i com utilitzar constructors en herència. També hem explorat els traits, que permeten la reutilització de codi de manera més flexible que les classes abstractes, i hem vist com implementar múltiples traits en una sola classe. Aquests conceptes són fonamentals per a la programació orientada a objectes en Scala i proporcionen una base sòlida per a la creació de codi modular i reutilitzable.
Curs de Programació en Scala
Mòdul 1: Introducció a Scala
- Introducció a Scala
- Configuració de l'Entorn de Desenvolupament
- Conceptes Bàsics de Scala: Sintaxi i Estructura
- Variables i Tipus de Dades
- Operacions Bàsiques i Expressions
Mòdul 2: Estructures de Control i Funcions
- Declaracions Condicionals
- Bucles i Iteracions
- Funcions i Mètodes
- Funcions d'Ordre Superior
- Funcions Anònimes
Mòdul 3: Col·leccions i Estructures de Dades
- Introducció a les Col·leccions
- Llistes i Arrays
- Conjunts i Mapes
- Tuples i Options
- Coincidència de Patrons
Mòdul 4: Programació Orientada a Objectes en Scala
- Classes i Objectes
- Herència i Traits
- Classes Abstractes i Classes Case
- Objectes Companys
- Objectes Singleton
Mòdul 5: Programació Funcional en Scala
- Immutabilitat i Funcions Pures
- Estructures de Dades Funcionals
- Monads i Functors
- For-Comprehensions
- Gestió d'Errors en la Programació Funcional
Mòdul 6: Conceptes Avançats de Scala
- Conversions i Paràmetres Implícits
- Classes de Tipus i Polimorfisme
- Macros i Reflexió
- Concurrència en Scala
- Introducció a Akka
