2013-10-23 70 views
1

有了变化StreamEventTransformer,我要创建行为类似StreamEventTransformer包装类,所以这里的代码:执行的覆盖方法,触发未覆盖一个

class Transformer implements EventSink, StreamTransformer { 
    EventSink rootSink; 

    Transformer(); 
    Transformer._useSink(this.rootSink); 

    void handleData(event, EventSink sink) { 
    print('inside handleData'); 
    sink.add(event); 
    } 

    void handleError(error, StackTrace stackTrace, EventSink sink) => 
     sink.addError(error, stackTrace); 

    void add(event) { 
    print('inside add'); 
    handleData(event, rootSink); 
    } 


    void addError(error, [StackTrace stackTrace]) => 
     handleError(error, stackTrace, rootSink); 

    void close() => rootSink.close(); 

    Stream bind(Stream source) => 
     new Stream.eventTransformed(source, (EventSink sink) { 
     EventSink eventSink = new Transformer._useSink(sink); 
     return eventSink; 
     }); 
} 

这一类,我只是必须从Transformer延伸以适应变化。

但是,当我将其扩展:

class PlusOneTransformer extends Transformer { 
    void handleData(data, sink) { 
    sink.add(data + 1); 
    } 
} 

并对其进行测试:

void main() { 
    StreamController controller = new StreamController(); 
    Stream stream = controller.stream.transform(new PlusOneTransformer()); 
    stream.listen(print); 
    controller.add(10); 
} 

我期待的输出为:

inside add 
11 

而是:

inside add 
inside handleData 
10 

所以它没有运行重写的handleData,它运行的是旧的。从调试器中,我可以看到执行的类是Transformer而不是PlusOneTransformer,而我正在使用PlusOneTransformer来转换流。

我错过了什么吗?

+0

发布您的代码为StreamController – Nathanial

+0

不确定如果你的意思是我如何实例化它,它在主函数 –

+0

虽然流控制器不是一个抽象类吗? – Nathanial

回答

3

错误就出在这行:

new Transformer._useSink(sink); 

这将分配一个Transformer,而不是子类。

最简单的解决方案:不分配一个新的水槽,但重用你已经有了一个:

Stream bind(Stream source) => 
     new Stream.eventTransformed(source, (EventSink sink) { 
     this.rootSink = sink; 
     return this; 
     }); 

由于变压器不能重复使用它可能是一个好主意,检查:

Stream bind(Stream source) => 
     new Stream.eventTransformed(source, (EventSink sink) { 
     if (this.rootSink != null) { 
      throw new StateError("Transformer already used"); 
     } 
     this.rootSink = sink; 
     return this; 
     });