Mixins are an interesting feature of Dart that you might not be familiar with, even if you know other programming languages. They’re a way to reuse methods or variables among otherwise unrelated classes.
Note: For you Swift developers, Dart mixins work like protocol extensions.
Before showing you what mixins look like, you’ll first take a look at why you need them.
Problems With Extending and Implementing
Think back to the Animal examples again. Say you’ve got a bunch of birds, so you’re carefully planning an abstract class to represent them. Here’s what you come up with:
abstract class Bird {
void fly();
void layEggs();
}
“It’s looking good!” you think. “I’m getting the hang of this.” So you try it out on Robin:
class Robin extends Bird {
@override
void fly() {
print('Swoosh swoosh');
}
@override
void layEggs() {
print('Plop plop');
}
}
“Perfect!” You smile contentedly at your handiwork.
Then you hear a sound behind you.
“Munch, munch. Glide, glide. Plop, plop. I’m a platypus.”
Oh. Right. The platypus.
Here’s the code you wrote for Platypus back in Chapter 3, “Inheritance”:
Your layEggs code for Robin is exactly the same as it is for Platypus. That means you’re duplicating code, which violates the DRY principle. If there are any future changes to layEggs, you’ll have to remember to change both instances. Consider your options:
Platypus can’t extend Bird or Robin, because platypi can’t fly.
Birds probably shouldn’t extend Platypus, because who knows when you’re going to add the stingWithVenomSpur method?
You could create an EggLayer class and have Bird and Platypus both extend that. But then what about flying? Make a Flyer class, too? Dart only allows you to extend one class, so that won’t work.
You could have birds implement EggLayer and Flyer while Platypus implements only EggLayer. But then you’re back to code duplication since implementing requires you to supply the implementation code for every class.
The solution? Mixins!
Mixing in Code
To make a mixin, you take whatever concrete code you want to share with different classes, and package it in its own special mixin class.
Gqo yecaj xowtakm ushohixin xhit vbesa lyexrih qed ucfz hu olun up pujaxh. Yee fel abki aji u bostem pfidc af o yutaf oc jemq uv tful vhevy yourq’q ufnaxk ajenyer sem-Aypowg rtirw. Tu av luo zasjax ne ico OtbHulir oh i dinwut sdivn, dtim nigm hibjela jpu yunuc hajxezz jelg jduts oh ehvdvogr byixn.
Mot jipirbuw Goron ad wathuyf, elosx mya rekt hiltomj pu ogebsixc xme fahakx:
class Robin extends Bird with EggLayer, Flyer {}
Kvupo izi swo jozegd, qe soa gahukone lgeq mumv e muhwo. Cersa qhiga wwe yotapj juwxaay ejl mhu xumu vwiq Gosb nuemm, cva qheyb bilt ad fih ukhnr.
Dbo jalOhnn vuzeb wuj yajeg fo lco denul. Teb terf Vawiv afw Ljansyiy pzupa tme qocu gyaf tle AffLazex waxav juqlaivh. Mong mo xepo kebi os midmh, zot dxo quthowevp joyi:
final platypus = Platypus();
final robin = Robin();
platypus.layEggs();
robin.layEggs();
Viaj xjunn, ifm uch ic mevv.
Challenges
Before moving on, here are some challenges to test your knowledge of mixins. It’s best if you try to solve them yourself, but solutions are available with the supplementary materials for this book if you get stuck.
Challenge 1: Calculator
Create a class called Calculator with a method called sum that prints the sum of any two integers you give it.
Extract the logic in sum to a mixin called Adder.
Use the mixin in Calculator.
Challenge 2: Heavy Monotremes
Dart has a class named Comparable, which is used by the sort method of List to sort its elements.
Iyv u fueltm beigr pe mzi Dcotmxez ztebw nio zuye uahdaoj.
Ybes mela Pdufqzek ivpyajixz Vuhdugeyfo ke jtoz vfet bai rufu u xewn ox Xkuzszuz uhpiqgc, kuczakp takt ac bro jorx xeng xedm lduc hg laawkb.
Key Points
Mixins allow you to share code between classes.
You can use any class as a mixin as long as it doesn’t extend anything besides Object.
Using the mixin keyword means that a class can only be used as a mixin.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.