首页 > 解决方案 > Scala 中的伴随对象和类访问

问题描述

假设我有这个类和对象层次结构:

class A extends BB
class B extends BB
object A extends BB

abstract class BB {
   def writer: Writer (<say Writer is a custom class>)

   def write: {
       writer.<dothing>
   }
}

因此 writer 必须在类中实现,AB不是在对象 A 中实现,这样代码才能正常工作。正确的?

new A.write
new B.write

因此 writer 必须在对象 A 中实现才能使此代码正常工作。正确的?

A.write

标签: scala

解决方案


trait : 是无状态的,class或者object两者都可以扩展trait

您将某物定义为object它没有任何状态。

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

如果您希望伴随对象将其定义如下,则不必再次扩展该特征。

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

在您的示例中,您可以将其定义trait为我没有看到任何状态,并且您可以将孩子定义为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()
}

推荐阅读