小白都能看懂的关于Mixins机制的理解

​ 在学习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开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值