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

Наследование путем расширения класса

Давайте сначала разберемся с наследованием путем расширения класса. Так же просто, как любой основной язык программирования oops. В Dart мы можем расширить другой класс, расширив этот класс. Рассмотрим следующий пример.

class Car {
  void accelerate(){
    print("simple acceleration");
  }
  
  void brakes(){
    print("simple brakes");
  }
}
class Toyota extends Car {
  @override
  void brakes(){
    print("toyota disk brakes");
  }
}
void main(){
  Toyota toyota = new Toyota();
  toyota.accelerate();
  toyota.brakes();
}
//output
simple acceleration 
toyota disk brakes

Наследование с использованием интерфейса

Теперь наследование с использованием интерфейса. Каждый класс дротика также является интерфейсом (неявно). В Dart нет отдельного ключевого слова для интерфейса, вместо этого мы можем просто реализовать класс. Большинство правил такие же, как в java.

При реализации интерфейса либо предоставьте реализацию для всех методов, либо сделайте вызовы абстрактными.

class Car {
  void accelerate(){
    print("simple acceleration");
  }
  
  void brakes(){
    print("simple brakes");
  }
}
class Toyota implements Car {
void brakes(){
    print("toyota disk brakes");
  }
  
  void accelerate(){
    print("toyota power acceleration");
  }
}
void main(){
  Toyota toyota = new Toyota();
  toyota.accelerate();
  toyota.brakes();
}
// output
toyota power acceleration
toyota disk brakes

Один интерфейс может реализовать несколько интерфейсов.

Наследование на основе примесей

Теперь самое интересное. Наследование на основе примесей. Mixins — это, по сути, класс, метод которого может быть расширен другими классами без расширения самого класса.

class Car {
  void accelerate(){
    print("simple acceleration");
  }
  
  void brakes(){
    print("simple brakes");
  }
}
mixin EuroVICar {
 void emission(){
    print("euro vi standard emission");
  }  
}
class Toyota with EuroVICar implements Car  {
void brakes(){
    print("toyota disk brakes");
  }
  
  void accelerate(){
    print("toyota power acceleration");
  }
}
void main(){
  Toyota toyota = new Toyota();
  toyota.accelerate();
  toyota.brakes();
  toyota.emission();
}
//
toyota power acceleration
toyota disk brakes
euro vi standard emission

Здесь метод выбросов используется классом Toyota как свой собственный. Также мы можем не использовать ключевое слово mixin.

Любой класс может вести себя как примесь, если он не расширяет какой-либо другой класс и не имеет конструкторов.

У нас также может быть класс с несколькими примесями. Также мы можем ограничить использование миксина определенными классами.

Класс Mixin подобен абстрактному классу. Но вы не можете расширить миксин.

class Car {
  void accelerate(){
    print("simple acceleration");
  }
  
  void brakes(){
    print("simple brakes");
  }
}
mixin EuroVICar {
 void emission(){
    print("euro vi standard emission");
  }  
}
// mixin using class keyword
class Autonomus {
  // don't declare a constructor if you want to use this 
  // class as a mixin type
  void autonomusDrive(){
    print("autonomus drive capable ");
  }
  
}
// This class is using two mixins
class Toyota with EuroVICar, Autonomus implements Car  {
void brakes(){
    print("toyota disk brakes");
  }
  
  void accelerate(){
    print("toyota power acceleration");
  }
}
void main(){
  Toyota toyota = new Toyota();
  toyota.accelerate();
  toyota.brakes();
  toyota.emission();
  toyota.autonomusDrive();
}
//output
toyota power acceleration
toyota disk brakes
euro vi standard emission
autonomus drive capable

Этого достаточно, чтобы начать работу с наследованиями в дартс. Задайте вопрос в комментариях, если он есть.