When programming dart and flutter you must have encountered and used abstract class
, interface(implements class)
and mixin
but whether you already understand the difference between them, let’s compare to clarify the difference
I have the following example
1 2 3 4 5 | <span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">AbstractClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">abstractFun</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">normalFun</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> |
extensions
1 2 3 4 5 | <span class="token keyword">class</span> C1 <span class="token keyword ">extensions</span> <span class="token class-name">AbstractClass</span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> <span class="token function">abstractFun</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> |
When you extend, you will
- Can only
extensions
1 class - Must
override abstract fun
or C1 isabstract class
- Reuse
normal fun
implements
1 2 3 4 5 6 7 8 | <span class="token keyword">class</span> C2 <span class="token keyword ">implements</span> <span class="token class-name">AbstractClass</span> <span class="token punctuation">{</span> <span class="token metadata symbol">@override</span> <span class="token function">abstractFun</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token metadata symbol">@override</span> <span class="token function">normalFun</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> |
When you implements
then you will
- Can
implements
multiple classes - Must
override
again all fun, includingnormal fun
but not reuse, or C2 isabstract class
mixin
mixin
is a way of reusing dart’s code, taking advantage of and overcoming the disadvantages of extends
and implements
1 2 3 4 5 6 7 8 | <span class="token keyword">mixin</span> M1 <span class="token punctuation ">{</span> <span class="token function">doWork</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">class</span> C3 <span class="token keyword">with</span> M1 <span class="token punctuation">{</span> <span class="token punctuation">}</span> |
When you with
mixin then you will
- Reusable code
- Can
with
multiplemixin
- You can restrict the class to use the mixin with
on Class
- Cannot
extends mixin
- If
implements mixin
thenoverride
again all fun or C3 isabstract class
, not code reuse - Where
with
multiplemixin
have the samefun
,fun
ofmixin
finally in the mixin list to be executed
In the above example, the parent class is an abstract class, if the parent class is a normal class, it’s the same, you guys can find out.