Generics это обобщения позволяющие добавить Вашему коду гибкости и не привязываться жёстко к типам данным.
// Вместо двух классов под разные типы данных... class PersonInt{ int id; String name; Person(this.id, this.name); } class PersonSring{ string id; String name; Person(this.id, this.name); } ... можно сделать один обобщённый class Person<T>{ T id; // идентификатор пользователя String name; // имя пользователя Person(this.id, this.name); } // Программа void main (){ Person bob = Person("324", "Bob"); print(bob.id.runtimeType); // String Person sam = Person(123, "Sam"); print(sam.id.runtimeType); // int }
В языке программирования Dart имеется возможность переопределять в классах стандартные операции, которые по сути над ними недоступны, но есть возможность задать правила их реализации.
// Переопределение операторов class Vector { final int x, y; Vector(this.x, this.y); Vector operator +(Vector v) => Vector(x + v.x, y + v.y); Vector operator -(Vector v) => Vector(x - v.x, y - v.y); } // Программа void main ( ) { var v = Vector(2, 3); var w = Vector(2, 2); print('${(v+w).x} , ${(v+w).y}'); // 4 , 5 print('${(v-w).x} , ${(v-w).y}'); // 0 , 1 }
Также у нас есть возможность отловить ошибку неизвестного метода:
// Отловить ошибку неизвестного метода class A { @override void noSuchMethod(Invocation invocation) { print('You tried to use a non-existent member: ' + '${invocation.memberName}'); } void hello ( ); } // Программа void main ( ) { var a2 = A ( ); a2.hello ( ); // You tried to use a non-existent member: Symbol("hello") }
Есть возможность расширять функционал уже существующих классов:
// Расширение существующих классов extension NumberParsing on String { int parseInt ( ) { return int.parse ( this ); } double parseDouble ( ) { return double.parse ( this ); } } // Программа void main ( ) { print ( '0777'.parseInt ( ) ); // 777 }
Enum или перечисления в Dart это особый тип класса, который содержит в себе набор константных значений.
// Перечисления enum Color { red, green, blue } // Программа void main ( ) { print(Color.red.index); // 0 print(Color.green.index); // 1 print(Color.blue.index); // 2 List<Color> colors = Color.values; print(colors); // [Color.red, Color.green, Color.blue] var aColor = Color.blue; switch (aColor) { case Color.red: print('Red as roses!'); break; case Color.green: print('Green as grass!'); break; default: print(aColor); // Color.blue } }
Определение типов - Typedefs
// Определяем свой собственный тип typedef MyType<T> int Function (T a, T b); // Создаём функцию int sort (int a, int b) => a-b; // Программа void main ( ) { print ( sort is MyType<int>); // true }
Call-классы
// Создаем такой класс class CallFunction { String call ( String a , String b ) => '$a $b'; } // Программа void main ( ) { var callVar = CallFunction (); print ( callVar ( 'Hello,' , 'world!' ) ); // Hello, world! }