2013-04-26 45 views
1

我可能会做一些错误语法或几乎所以可选的回调“不这样做”可能是有效的,但似乎这应该工作:与可选参数

class Thing { 
    //static dynamic noop =() { }; // fails 
    static dynamic noop = ([dynamic value]) { }; // works for null cases 
    dynamic _callback; 
    Thing._([dynamic callback([dynamic value])]) 
    : this._callback = callback != null ? callback : Thing.noop; 

    factory Thing([dynamic callback([dynamic value])]) { 
    return new Thing._(callback); 
    } 
} 

当我运行这些测试时,第一一个失败,但第二,第三和第四遍:

//Caught type '() => dynamic' is not a subtype of type '([dynamic]) => dynamic' of 'callback'. 
test('callback with optional param',() { 
    var thing = new Thing(() { }); 
    thing.doCallback(); 
    thing.doCallback('data'); 
}); 

test('callback with optional param',() { 
    var thing = new Thing(([_]) { }); 
    thing.doCallback(); 
    thing.doCallback('data'); 
}); 

test('callback with optional param',() { 
    var thing = new Thing(); 
    thing.doCallback(); 
    thing.doCallback('data'); 
}); 

test('callback with optional param',() { 
    var thing = new Thing(null); 
    thing.doCallback(); 
    thing.doCallback('data'); 
}); 
+0

为了跟进,我认为这种方法将把Thing的签名更改为([动态回调(),动态数据(动态值)]),以便现有的消费者仍然可以按照平时注册回调,但新消费者也可以选择进入数据通知。 – Perry 2013-04-26 17:01:35

回答

2

dynamic callback([dynamic value])意味着callback可以采取一个参数或没有。在您的第一个测试用例中,您提供的回调(() { })仅处理不带参数的调用。所以它不尊重合同。这就是为什么你会得到这个错误。

+0

是的,太过专注于试图避免突然改变:P – Perry 2013-04-26 16:45:23