Сегодня я расскажу, как работать с Generics.
🔖Что это?
Generics позволяют создавать классы, методы и интерфейсы, которые могут работать с различными типами данных. Они позволяют определять параметры типа, которые можно заменить конкретными типами во время выполнения. Это особенно полезно для создания универсальных структур данных или методов, которые могут работать с различными типами, сохраняя при этом строгую типизацию.
🔖Как это работает?
Рассмотрим пример, где мы создаем класс, который будет работать с моделью Model. Мы определим класс Repository, который будет использовать дженерики для работы с различными типами моделей.
Создадим базовую модельку с параметром name.
class Model {
Model(this.name);
final String name;
}Определим класс Repository, который принимает параметр типа T. Условие extends Model гарантирует, что T будет подтипом Model. Создадим два метода: один — для добавления элементов в список, а другой — для их получения.
class Repository<T extends Model> {
final List<T> items = [];
void addItem(T item) => items.add(item);
List<T> getItems() => items;
}Теперь добавим модели User и Product, которые будут наследоваться от базовой модели. У каждой модели есть свои свойства id и price.
class User extends Model {
User(this.id, String name) : super(name);
final int id;
}
class Product extends Model {
Product(String name, this.price) : super(name);
final double price;
}Теперь перейдем к реализации и посмотрим, как с этим работать. В примере я создала два репозитория: один — для управления пользователями, а другой — для управления продуктами.
void main() {
// Репозиторий для пользователей
final userRepository = Repository<User>();
userRepository.addItem(User(1, 'Alice'));
userRepository.addItem(User(2, 'Bob'));
// Выводим информацию о пользователях
for (var user in userRepository.getItems()) {
print('User: ${user.name}, ID: ${user.id}');
}
// Репозиторий для продуктов
final productRepository = Repository<Product>();
productRepository.addItem(Product('Laptop', 999.99));
productRepository.addItem(Product('Smartphone', 499.99));
// Выводим информацию о продуктах
for (var product in productRepository.getItems()) {
print('Product: ${product.name}, Price: \$${product.price}');
}
}После запуска приложения выводятся следующие данные:
консоль
User: Alice, ID: 1
User: Bob, ID: 2
Product: Laptop, Price: $999.99
Product: Smartphone, Price: $499.99
Благодаря тому, что репозиторий принимает дженерики, мы можем подставлять туда любую модель, которая наследуется от Model.
🔖Преимущества использования
🔴Типобезопасность: Generics обеспечивают строгую типизацию, что позволяет избежать ошибок времени выполнения
🔴Повторное использование кода: вы можете создавать универсальные классы и методы, которые можно использовать с различными типами.
🔴Читаемость кода: код становится более понятным и структурированным.
Теперь ты освоил суперсилу гибкости! Главное — применять ее, иначе это будет как шпагат, который уже не такой уж и поперечный🤪
