trait: is stateless, and class
or object
both can extend trait
.
You define something as object
when it does not have any states.
scala> trait CanFly {
| def fly: String
| }
defined trait CanFly
scala> class DuckCanFly extends CanFly {
| override def fly: String = "duck duck"
| }
defined class DuckCanFly
scala> object EagleCanFly extends CanFly {
| override def fly: String = "eagle eagle"
| }
defined object EagleCanFly
scala> new DuckCanFly().fly
res0: String = duck duck
scala> EagleCanFly.fly
res1: String = eagle eagle
If you want companion object define it as below, you don't have to extend the trait again.
scala> :paste
// Entering paste mode (ctrl-D to finish)
class DuckCanFly extends CanFly {
override def fly: String = "duck duck"
}
object DuckCanFly {
def apply(): DuckCanFly = new DuckCanFly()
}
// Exiting paste mode, now interpreting.
defined class DuckCanFly
defined object DuckCanFly
scala> DuckCanFly().fly
res8: String = duck duck
In your example, you can define it as trait
as I do not see any state, and you can define childs as object
.
trait BB {
def writer: Writer
def write = writer.write()
}
object A extends BB {
def writer: Writer = new AWriter()
}
object B extends BB {
def writer: Writer = new BWriter()
}