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.
Abstract class:
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:
mixin FeaturesMixin { bool blueTooth = true; bool dualSim = false; bool nfc = true;}
Extends a mixin:
// Extends FeaturesMixinmixin 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:
class Phone with FeaturesMixin, UtilitiesMixin implements Device {
--
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 FeaturesMixinmixin 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);}