我正在学习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
之一。这是一个很好的编程练习吗?不会破坏类层次结构或抽象的目的吗?
答案 0 :(得分:1)
不会破坏类层次结构或抽象的目的吗?
一般来说,你是对的。但在这种情况下,抽象不是用来实现多种实现的方式,没有Empty
或NonEmpty
的TweetSet就没有意义。在这种情况下,使用抽象为TweetSet
提供统一的接口。
拇指的一般规则是,如果它们位于同一文件中,则允许取决于子类型。