2014-01-12 45 views
2

我试图将数据从服务器延迟加载到Map中。
因为这个原因,我想添加功能到地图,这样当一个关键不存在,一个调用完成得到值Dart扩展Map以方便延迟加载

我想这是什么:

class LazyMap extends Map { 
    // use .length for now. When this works, go use xhr 
    operator [](key) => LazyMap.putIfAbsent(key,() => key.length); 
} 

LazyMap test = new LazyMap(); 

main() { 
    print(test.containsKey('hallo')); // false 

    // I prefer to use this terse syntax and not have to use putIfAbsent 
    // every time I need something from my map 
    print(test['hello']); // 5 

    print(test.containsKey('hallo')); // true 
} 

这就提出了一个错误,指出“无法解析隐式super调用构造地图”,这是神秘的对我。

这是我第一次尝试延伸任何东西,所以我可能会做些愚蠢的事情。 任何建议做得更好,或者可能告诉我,我正在使用一个不好的做法,将不胜感激。

我已经看过这个答案:How do I extend a List in Dart,但这是关于扩展List,而不是Map。我找过一个MapBase但找不到一个。
我已经看过这个答案:I want to add my own methods to a few Dart Classes,但这似乎是一个非常古老的答案,没有真正的解决方案。

亲切的问候, 亨德里克·扬

回答

3

望着这post,你不能扩展地图和它的子类。我认为得到你想要的最好的方法就是实现它。

class LazyMap implements Map { 
    Map _inner = {}; 

    operator [](key) => _inner.putIfAbsent(key,() => key.length); 

    // forward all method to _inner 
} 
+0

嗨法里斯。您发布的链接不起作用。它指向你自己的Gmail收件箱,这当然不适合我。你能编辑链接吗?除此之外,这是一个非常有用的答案。我本来希望听到其他情况,但我必须与实施似乎相抗衡。 –

+0

@HendrikJan编辑。 –

3

你应该看着the other answer of How do I extend a List in Dart?;)在这个答案,我指向DelegatingList。在它旁边有DelegatingMap

您可以使用DelegatingMap作为超类或混入做你想要什么:

import 'package:quiver/collection.dart'; 

class LazyMap extends DelegatingMap { 
    final delegate = {}; 

    operator [](key) => putIfAbsent(key,() => key.length); 
} 

请注意,您将无法因为XHR是异步使用此与XHR。

+0

嗨,亚历山大。我确实看到了你的答案,看起来很有用。在使用Dart之前,我更喜欢使用“股票”飞镖,而不是使用外部库。对于图书馆来说,我不确定相同的图书馆在几年内还存在。我可能会研究颤抖,看看它是如何写的。 –

+1

_pub.dartlang.org_永远不会删除现有的软件包。所以你可以使用_packages_而不用担心。 –

+0

这很好理解。在JavaScript中有很多库不被维护或质量低下。 Dart酒吧包装的维护和质量是否有保证?或者是由用户来决定他/她是否认为质量足够高? (或者这应该是一个新的SO问题?) –