在学习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’);
}
总结
首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。
另外一部分原因在于资料也还没有看完,一面时凭借那份资料考前突击恶补个几天居然也能轻松应对(在这里还是要感谢那份资料,真的牛),于是自我感觉良好,资料就没有怎么深究下去了。
之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。
下一步还是要查漏补缺,进行针对性复习。
最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!!!一定要看完!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
程的考察显得捉襟见肘。
下一步还是要查漏补缺,进行针对性复习。
最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!希望大家不要犯和我一样的错误呀!!!一定要看完!
[外链图片转存中…(img-cFzmqHfw-1715258076210)]
[外链图片转存中…(img-1MIQJWVp-1715258076211)]
[外链图片转存中…(img-TyGm2MI6-1715258076212)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!