Объектно-ориентированное программирование лучше всего известно благодаря возможности повторного использования и простоте сравнения с реальным миром. В этой теме я попытался осветить повторное использование классов в Dart.

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

Возьмем пример самолета и автобуса.

class Aeroplane {
 void vehicle() => print(“vehicle”);
 void passenger() => print(“many passengers”);
 void carryLoad() => print(“carry load”);
 void detail() {
   vehicle();
   passenger();
   carryLoad();
   print(“Run in airport”);
 }
}
class Bus {
 void vehicle() => print(“vehicle”);
 void passenger() => print(“many passengers”);
 void carryLoad() => print(“carry load”);
 void detail() {
   vehicle();
   passenger();
   carryLoad();
   print(“Run in road”);
 }
}
void main() {
 Aeroplane().detail();
 Bus().detail();
}

Выходы будут

vehicle 
many passengers 
carry load
Run in airport 
vehicle 
many passengers 
carry load 
Run in road

Что нам делать, если нам нужно добавить еще один класс Car? Самый распространенный способ — использовать расширение. Здесь мы можем создать абстрактный класс Vehicle со всеми распространенными методами и сделать их доступными для других классов, расширив его. В основном мы делаем родительский класс абстрактным, чтобы предотвратить создание его объекта, а разрешать только наследование.

abstract class Vehicle {
  void vehicle() => print("vehicle");
  void passenger() => print("many passengers");
  void carryLoad() => print("carry load");
    void detail(String detail) {
      print("${this.runtimeType}-------");
      vehicle();
      passenger();
      carryLoad();
      print(detail);
  }
}
class Aeroplane extends Vehicle {
}
class Bus extends Vehicle {
}
void main() {
  Aeroplane().detail("Run in airport");
  Bus().detail("Run in land");
}

Примеси

Это хороший подход, так как теперь мы можем добавить больше транспортных средств. Но одна проблема заключается в том, что по мере увеличения транспортного средства мы поймем, что все методы предназначены не только для транспортного средства. Давайте возьмем в качестве примера Корабль. Вместо того, чтобы работать, он плавает, что очень ограничивает, когда нам нужно добавить больше функций, поскольку мы можем расширить только один класс. В этом случае нам нужны примеси.

mixin Run {
  void run() => print("can Run");
}
mixin Fly{
  void fly() => print("can Fly");
}
mixin Float{
  void float() => print("float in water");
}
abstract class Vehicle {
  void vehicle() => print("vehicle");
  void passenger() => print("many passengers");
  void carryLoad() => print("carry load");
}
  
class Aeroplane extends Vehicle with Fly {
  detail() {
    vehicle();
    passenger();
    carryLoad();
    fly();
  }
 
}
class Bus extends Vehicle with Run {
  detail() {
    vehicle();
    passenger();
    carryLoad();
    run();
  }
  
}
class Ship extends Vehicle with Float {
  detail() {
    vehicle();
    passenger();
    carryLoad();
    float();
  }
}
void main() {
  Aeroplane().detail();
  Bus().detail();
  Ship().detail();
}

Последний трюк, который у нас есть, — это возможность делать что-то, что мне нравится называть обратным расширением. Мы можем создать примесь, которая использует методы класса, которые мы затем можем использовать с каждым подклассом.

Если мы хотим разбить детали,мы можем сделать это, создав их с собственными примесями, используя наключевом слове , чтобы предоставить доступ только к >Класс автомобиля.

mixin Detail on Vehicle {
  void detail(String action) {
    print("${this.runtimeType}--------");
    vehicle();
    passenger();
    carryLoad();
    print(action);
  }
}
abstract class Vehicle {
  void vehicle() => print("vehicle");
  void passenger() => print("many passengers");
  void carryLoad() => print("carry load");
}
  
class Aeroplane extends Vehicle with Detail {
}
class Bus extends Vehicle with Detail {
 
}
class Ship extends Vehicle with Detail {
}
void main() {
  Aeroplane().detail("Can fly");
  Bus().detail("Can Run");
  Ship().detail("Can Float");
}

Заключение

Flutter за короткое время стал значительно популярнее среди разработчиков благодаря поддержке мощного языка Dart. Следовательно, полезно узнать о функциях Dart. Все приведенные выше коды протестированы и могут быть запущены непосредственно на https://dartpad.dartlang.org/ в целях обучения. Я надеюсь, что это поможет вам понять основы классов Dart и повторного использования.