Scala do not have interface, but it support same functionality using traits. A trait in Scala can have abstract fields, class that implements this trait must provide values to these abstract fields.
Syntax
trait TraitName{
......
......
}
Example
trait SortData{
def sort() = {
.....
.....
}
}
Can a trait extends other trait?
Yes
trait StringSort extends SortData {
.......
.......
}
Can a class extend multiple traits?
Yes
Can a trait have concrete methods?
Yes
Can a trait have concrete fields?
Yes
Let’s implement trait with simple logger example.
Step 1: Define Logger trait.
trait Logger {
def logInfo(msg: String): Unit = println(msg)
def logWarning(msg: String): Unit = println(msg)
def logError(msg: String): Unit = println(msg)
}
Step 2: Define ConsoleLogger and DBLogger traits.
trait ConsoleLogger extends Logger {
override def logInfo(msg: String): Unit = {
val date = new java.util.Date()
println(s"$date $msg")
}
override def logWarning(msg: String): Unit = {
logInfo(msg)
}
override def logError(msg: String): Unit = {
logInfo(msg)
}
}
trait DBLogger extends Logger {}
Step 3: Define a class and extend Logger trait.
class UserService extends Logger {
def registerNewUser(id: Int, name: String) = {
logInfo(s"user id: $id and name: $name registered successfully!!!!")
}
}
Now you can supply any Logger trait to the UserService object and use.
Example 1: UserService instance with Logger trait
val userService1 = new UserService() with Logger
Example 2: UserService instance with ConsoleLogger trait
val userService2 = new UserService() with ConsoleLogger
Find the below working application.
TraitDemo.scala
package com.sample.app
object TraitDemo extends App {
trait Logger {
def logInfo(msg: String): Unit = println(msg)
def logWarning(msg: String): Unit = println(msg)
def logError(msg: String): Unit = println(msg)
}
trait ConsoleLogger extends Logger {
override def logInfo(msg: String): Unit = {
val date = new java.util.Date()
println(s"$date $msg")
}
override def logWarning(msg: String): Unit = {
logInfo(msg)
}
override def logError(msg: String): Unit = {
logInfo(msg)
}
}
trait DBLogger extends Logger {}
class UserService extends Logger {
def registerNewUser(id: Int, name: String) = {
logInfo(s"user id: $id and name: $name registered successfully!!!!")
}
}
val userService1 = new UserService() with Logger
val userService2 = new UserService() with ConsoleLogger
userService1.registerNewUser(1, "Krishna")
userService2.registerNewUser(1, "Krishna")
}
Previous Next Home
No comments:
Post a Comment