In this lesson, we will cover Interfaces and Mixins. Interfaces act as a contract containing properties and methods that a class must define once it 「implements」 this interface. Mixins are Dart’s way of sharing properties and methods from multiple classes, since by design Dart adopts a single-inheritance model.less
Abstract class:this
void main() { var pixel = Phone('Pixel XL', 'HTC'); pixel.getDeviceInfo(); } abstract class Device { String name; String manufacturer; void getDeviceInfo(); } class Phone implements Device { String name; String manufacturer; void getDeviceInfo() => print(''' === Device name: $name Manufactured by: $manufacturer '''); Phone(this.name, this.manufacturer); }
Define a mixin:spa
mixin FeaturesMixin { bool blueTooth = true; bool dualSim = false; bool nfc = true; }
Extends a mixin:code
// Extends FeaturesMixin mixin UtilitiesMixin on FeaturesMixin { bool calculator = true; bool flashlight = true; bool thermometer = false; String _has(bool feat) => feat ? 'Yes': 'No'; void getAllFeatures() => print(''' --FEATURES-- Bluetooth: ${_has(super.blueTooth)} Dual SIM: ${_has(super.dualSim)} NFC: ${_has(super.nfc)} Calculator: ${_has(calculator)} Flashlight: ${_has(flashlight)} Thermometer: ${_has(thermometer)} === '''); }
use Mixin:blog
class Phone with FeaturesMixin, UtilitiesMixin implements Device {
--ip
void main() { var pixel = Phone('Pixel XL', 'HTC'); pixel.getDeviceInfo(); pixel.getAllFeatures(); /* === Device name: Pixel XL Manufactured by: HTC --FEATURES-- Bluetooth: Yes Dual SIM: No NFC: Yes Calculator: Yes Flashlight: Yes Thermometer: No === */ } mixin FeaturesMixin { bool blueTooth = true; bool dualSim = false; bool nfc = true; } // Extends FeaturesMixin mixin UtilitiesMixin on FeaturesMixin { bool calculator = true; bool flashlight = true; bool thermometer = false; String _has(bool feat) => feat ? 'Yes': 'No'; void getAllFeatures() => print(''' --FEATURES-- Bluetooth: ${_has(super.blueTooth)} Dual SIM: ${_has(super.dualSim)} NFC: ${_has(super.nfc)} Calculator: ${_has(calculator)} Flashlight: ${_has(flashlight)} Thermometer: ${_has(thermometer)} === '''); } abstract class Device { String name; String manufacturer; void getDeviceInfo(); } class Phone with FeaturesMixin, UtilitiesMixin implements Device { String name; String manufacturer; void getDeviceInfo() => print(''' === Device name: $name Manufactured by: $manufacturer '''); Phone(this.name, this.manufacturer); }