在学习Flutter源码的时候,看到各种复杂的mixin和on,为了便于后续Flutter的学习,这里有必要一起来份详细Dart 的 Mixin机制。
什么是mixins
首先看看官方文档的定义:
Mixins are a way of reusing a class’s code in multiple class hierarchies.
即:Mixins是用来复用多个类之间的代码,减少耦合。
再来看看维基百科
对它的定义:
mixin
是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin
类的方法、变量而不必成为其子类。
这两种解释我任务维基百科描述的更通俗一点,下面我们来详细解释:
讲解
假如我们有两个类A,B,现在需要使用mixins定义类T
class T = A with B;
//或
class T extends A with B {}
那么我们得到结果class T
是什么样的? 假设我们A类中的所有方法为AM,B类中所有的方法集合叫BM,那么T中的方法集合就为:
BM U (AM-BM)
即:T中的方法为A 和 B类中方法的集合,如果有重复方法,取B中的方法(with 最右侧的方法)
上面伪代码就是最直接简单的方式,相信大家应该都能看懂。下面我们来举个例子详细介绍一下
我们来举几个例子
1. A with B
//A
class A {
a() {
print(‘A.a()’);
}
b() {
print(‘A.b()’);
}
}
//B
class B {
a() {
print(‘B.a()’);
}
}
//Z
class Z extends A with B {}
void main() {
Z z = Z();
z.a();
}
根据上面伪代码AM U (AM-BM)
讲解(Z的方法为A,B方法集合,有重复方法取with最右边类的方法),得出Z类中最终包含的方法应该是:B.a(),A.b()
代码输出结果是:
B.a()
2. A with B,C
A with B, C可以理解为:(A with B) with C
//A
class A {
a() {
print(‘A.a()’);
}
b() {
print(‘A.b()’);
}
}
//B
class B {
a() {
print(‘B.a()’);
}
b() {
print(‘B.b()’);
}
c() {
print(‘B.c()’);
}
}
//C
class C {
a() {
print(‘C.a()’);
}
}
//Z
class Z extends A with B, C {}
void main() {
Z z = new Z();
z.a();
z.b();
z.c();
}
根据上面的逻辑整理最终方法集合公式为CM U (BM - CM) U (AM - BM - CM)
,最终Z包含的方法应该是:C.a(), B.b(), B.c()
代码输出结果是:
C.a()
B.b()
B.c()
下面是重点关注容易被忽略的关于mixin机制里面super的注意事项
abstract class BaseA {
BaseA() {
initInstances();
}
initInstances() {
//do nothing
}
}
mixin B on BaseA {
@override
initInstances() {
super.initInstances();
print(‘B’);
}
}
mixin C on BaseA {
@override
initInstances() {
super.initInstances();
print(‘C’);
}
}
mixin D on BaseA {
@override
initInstances() {
super.initInstances();
print(‘D’);
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
img-yGKnJ85y-1715899398033)]
[外链图片转存中…(img-xrajKodF-1715899398034)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!