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()
}