6

Is it possible to extend a generic list with my my own specific list. Something like:

class Tweets<Tweet> extends List<T>

And how would a constructor look like, if I wanted to construct with my own constructor:

Datasource datasource = new Datasource('http://search.twitter.com/search.json');
Tweets tweets = new Tweets<Tweet>(datasource);

And how to call the parent constructor then, as this is not done in a extended class?

Eduardo Copat
  • 4,941
  • 5
  • 23
  • 40
JvdBerg
  • 21,777
  • 8
  • 38
  • 55

2 Answers2

4

This is what i found out to extend list behavior:

  1. import 'dart:collection';
  2. extends ListBase
  3. implement [] and length getter and setter.

See adapted Tweet example bellow. It uses custom Tweets method and standard list method.

Note that add/addAll has been removed.

Output:

[hello, world, hello]
[hello, hello]
[hello, hello]

Code:

import 'dart:collection';

class Tweet {
  String message;

  Tweet(this.message);
  String toString() => message;
}

class Tweets<Tweet> extends ListBase<Tweet> {

  List<Tweet> _list;

  Tweets() : _list = new List();


  void set length(int l) {
    this._list.length=l;
  }

  int get length => _list.length;

  Tweet operator [](int index) => _list[index];

  void operator []=(int index, Tweet value) {
    _list[index]=value;
  }

  Iterable<Tweet> myFilter(text) => _list.where( (Tweet e) => e.message.contains(text));

}


main() {
  var t = new Tweet('hello');
  var t2 = new Tweet('world');

  var tl = new Tweets();
  tl.addAll([t, t2]);
  tl.add(t);

  print(tl);
  print(tl.myFilter('hello').toList());
  print(tl.where( (Tweet e) => e.message.contains('hello')).toList());
}
Daniel
  • 4,051
  • 2
  • 28
  • 46
Nico
  • 1,549
  • 2
  • 11
  • 9
1

Dart's List is an abstract class with factories.

I think you could implement it like this:

class Tweet {
  String message;

  Tweet(this.message);
}

class Tweets<Tweet> implements List<Tweet> {
  List<Tweet> _list;

  Tweets() : _list = new List<Tweet>();

  add(Tweet t) => _list.add(t);
  addAll(Collection<Tweet> tweets) => _list.addAll(tweets);
  String toString() => _list.toString();
}


main() {
  var t = new Tweet('hey');
  var t2 = new Tweet('hey');

  var tl = new Tweets();
  tl.addAll([t, t2]);

  print(tl);
}

There doesn't seem to be any direct way to do this and looks like there's also a bug ticket: http://code.google.com/p/dart/issues/detail?id=2600

Update: One way is to use noSuchMethod() and forward calls.

Kai Sellgren
  • 27,954
  • 10
  • 75
  • 87
  • Thanks, I did not know that a `List` is a abstract class with factories. When I look in the DartEditor there are a lot of methods that need to be implemented. Hmm .. not the solution I hoped for. – JvdBerg Dec 13 '12 at 18:57