Класс 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
Этого достаточно, чтобы начать работу с наследованиями в дартс. Задайте вопрос в комментариях, если он есть.