2013-10-23 68 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; 
     });