Я хочу добавить свои собственные методы в несколько классов Dart.

Моя попытка просто «расширить» класс Map не увенчалась успехом, потому что List является интерфейсом и не может быть расширен, но должен быть реализован.

Цель состояла в том, чтобы просто добавить несколько методов поверх некоторого существующего класса, например:

List.add_unique(item), где я хочу добавить, только если элемент еще не существует. Это можно легко сделать, добавив логику append !=null с помощью List.indexOf(item) != -1 (где -1 не найдено). Это был бы хороший и простой для понимания пример?

Но как сделать это кратчайшим способом с наименьшими общими накладными расходами? Я думаю, что я был бы в порядке с небрежным набором текста - по крайней мере, для начала.

Есть и другие методы, которые я хочу добавить или изменить, например, метод .add() для класса Map.

Я не имел дело с интерфейсами много лет и думаю, что в целом может быть гораздо более простой способ начать работу над этой частью моего проекта.

Спасибо!


person george koller    schedule 16.10.2012    source источник
comment
Проголосуйте за проблему: code.google.com/p/dart/issues. /detail?id=13 позволяет расширять нативные классы.   -  person Kai Sellgren    schedule 17.10.2012
comment
Миксины идут, тоже должны помочь.   -  person Seth Ladd    schedule 18.10.2012


Ответы (1)


Я тоже столкнулся с этой проблемой. Лучший обходной путь на данный момент — создать класс, который перенаправляет все вызовы методов. Что-то вроде: https://github.com/dart-lang/html5lib/blob/master/lib/src/list_proxy.dart

Затем вы можете наследоваться от ListProxy и переопределять или добавлять любые методы, которые вам нужны.

Если люди сочтут это достаточно полезным, возможно, мы сможем поместить его в отдельный паб-пакет. Я надеюсь, что мы сможем исправить dart:core, чтобы он поддерживал наследование от всех основных классов коллекций.

Кстати, если вы пытаетесь переопределить метод в Map, это намного проще: вы можете import 'dart:coreimpl'; и расширить HashMapImplementation.

person Jenny Messerly    schedule 17.10.2012
comment
Кроме того, с уходом явных интерфейсов List станет абстрактным классом. - person Seth Ladd; 18.10.2012
comment
Я смог сделать то, что мне было нужно, с помощью вспомогательных функций, они не очень амбициозны, но действительно помогают мне в этом. Я бы ничего не сделал в Ruby, но Dart есть Dart, и несколько экспертов призвали пойти по этому пути. Явно не одно и то же. - person george koller; 03.11.2012