我有一个扩展Trait的类,我想编写可以与类混合的Traits并覆盖一些方法 .

我 class 延伸的特征看起来像这样

trait CharSource  {

    def source: Iterator[Char]
    def words: Iterator[String] = { 
        while(source.hasNext){
           //Logic to get the next word from a Char Iterator
        }
    }

    final def chars: Iterator[Char] = words.toString().toIterator
}

扩展CharSource的类

class IteratorDocumentSource(iterator: Iterator[Char]) extends CharSource {
   def source = iterator
}

现在我想编写一个特性来覆盖IteratorDocutmentSource中的源def以获得一些特殊行为

trait PunctuationRemover extends Transformer {self: CharSource =>
override

  /** Character source.  Overriding should be in terms of `super.source` for           
  stackability. */
  abstract val source: Iterator[Char] = {
    super.source
    //additional logic ...
  }
}

PunctioationRemover扩展的变换器特性

trait Transformer {self: CharSource =>

  protected def source: Iterator[Char]
  def words: Iterator[String]
}

拨打此电话时出错

new IteratorDocumentSource("Hello World!".iterator) with PunctuationRemover

错误:

导致中止运行的异常或错误:SampleSuite $$ anonfun $ 2 $$ anon $ 3.document $ PunctuationRemover $$ super $ source()Lscala / collection / Iterator; java.lang.AbstractMethodError:SampleSuite $$ anonfun $ 2 $$ anon $ 3.document $ PunctuationRemover $$ super $ source()Lscala / collection / Iterator;

我引用了这篇文章,但我认为我的情况有点不同Can I override a scala class method with a method from a trait?