我有一個抽象類(這是一個類似的例子)Printer
它打印提供的參數,除非它無法通過過濾器。 Printer
是逆變w.r.t.其通用類型爲T
。超類型的Scala複製方法
class Printer[-T] {
val filters: Seq[Function2[T => Boolean]]
def print(t: T): Unit {
if (filters.forall(_(t))) doPrint(t)
}
def doPrint(t: T): Unit
}
我現在有Printer
20子類 - 一個對於字符串,整型,等等。由於Printer
是逆變的,filters
必須爲val
。但是,如果我想要一個Printer
的方法來添加一個過濾器,它需要是不可變的。
def addFilter[TT <: T](t: TT): Printer[TT]
不幸的是我現在需要在我的20個子類中的每一箇中實現這個方法。有沒有辦法解決?
更新:另外,在addFilter
,我不知道如何返回子類而不是超類Printer
。例如,如果我在StringPrinter
上調用addFilter
,理想情況下我會返回StringPrinter
這一類型。
很好的例子。我不認爲這對我很有用。我使用子類,因爲功能通常非常複雜,我使用反射創建DSL中指定的子類的實例。 – schmmd
更多地思考它,關注的分離可能是我的問題。也許我會製作一個'ConstraintedPrinter [T](printer:Printer [T],filters:Seq [T => Boolean])''。 – schmmd