首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala中的伴生对象和类访问

Scala中的伴生对象和类访问
EN

Stack Overflow用户
提问于 2018-06-06 04:02:17
回答 1查看 574关注 0票数 0

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

代码语言:javascript
复制
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>
   }
}

所以写入器必须在类AB中实现,而不是在对象A中实现,这样代码才能正常工作。对,是这样?

代码语言:javascript
复制
new A.write
new B.write

因此,写入器必须在对象A中实现,才能使此代码工作。对,是这样?

代码语言:javascript
复制
A.write
EN

回答 1

Stack Overflow用户

发布于 2018-06-06 06:45:11

特征:无状态,classobject都可以扩展trait

当某个东西没有任何状态时,您可以将其定义为object

代码语言:javascript
复制
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

如果你想让伴生对象像下面这样定义它,你不需要再次扩展特征。

代码语言:javascript
复制
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

代码语言:javascript
复制
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()
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50708069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档