Scala - Superclass在其方法中实例化其子类?

时间:2016-02-18 08:16:28

标签: scala inheritance

我正在学习Scala的功能编程原理' Coursera课程。在作业3中,有一个任务是使用谓词过滤推文集,并提供一些结构:

abstract class TweetSet {
  /**
   * This method takes a predicate and returns a subset of all the elements
   * in the original set for which the predicate is true.
   *
   * Question: Can we implment this method here, or should it remain abstract
   * and be implemented in the subclasses?
   */
   def filter(p: Tweet => Boolean): TweetSet = ???

  /**
   * This is a helper method for `filter` that propagetes the accumulated tweets.
   */
   def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet

  /* Some Other Code */

}

class Empty extends TweetSet {
  def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = ???
}

class NonEmpty(elem: Tweet, left: TweetSet, right: TweetSet) extends TweetSet {
  def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = ???
}

我能够使用

找出抽象类中的filter方法
def filter(p: Tweet => Boolean, acc: TweetSet): TweetSet = filterAcc(p, new Empty)

与我在网上找到的大多数解决方案相同。

问题是,抽象超类TweetSet在其方法中实例化其子类Empty之一。这是一个很好的编程练习吗?不会破坏类层次结构或抽象的目的吗?

1 个答案:

答案 0 :(得分:1)

  

不会破坏类层次结构或抽象的目的吗?

一般来说,你是对的。但在这种情况下,抽象不是用来实现多种实现的方式,没有EmptyNonEmpty的TweetSet就没有意义。在这种情况下,使用抽象为TweetSet提供统一的接口。

拇指的一般规则是,如果它们位于同一文件中,则允许取决于子类型。