mixin是什么

mixin应该怎么理解呢,对Java系出身的我来说,这是一个新概念,各类资料的介绍也没找到一个清晰的定义。从个人理解来看,可以把它想象为Kotlin中的接口(和Java的区别是可以带非抽象的属性和方法),而多个mixin可以相互覆盖以实现组合,提供了非常大的灵活性,也可以达到类似多重继承的效果,本文将从简单到复杂,演示mixin在Dart中的用法

最简单的mixin

mixin TestMixin {void test() {print('test');}int testInt = 1;void test2();
}class Test with TestMixin {@overridetest2() {print('test2');}
}void main() {Test().test();            // testprint(Test().testInt);    // 1Test().test2();           // test2
}
复制代码

mixin本身可以是抽象的,可以定义各种方法属性,也可以是抽象的,等后续类去实现

基于某个类型的mixin

class BaseObject {void method() {print('call method');}
}
mixin TestMixin on BaseObject{void test() {print('test');}int testInt = 1;void test2() {method();}
}class Test extends BaseObject with TestMixin {
}void main() {Test().test();            // testprint(Test().testInt);    // 1Test().test2();           // call method
}
复制代码

当使用on关键字,则表示该mixin只能在那个类的子类使用了,那么结果显然的,mixin中可以调用那个类定义的方法、属性

多个mixin

mixin TestMixin {void test() {print('test');}int testInt = 1;void test2();
}mixin TestMixin2 {int testInt = 2;void test3() {print('test3');}
}class Test with TestMixin, TestMixin2 {@overridetest2() {print('test2');}
}void main() {Test().test();            // testprint(Test().testInt);    // 2Test().test2();           // test2Test().test3();           // test3
}
复制代码

如果把TestMixin和TestMixin2的先后顺序改一下:

mixin TestMixin {void test() {print('test');}int testInt = 1;void test2();
}mixin TestMixin2 {int testInt = 2;void test3() {print('test3');}
}class Test with TestMixin2, TestMixin {@overridetest2() {print('test2');}
}void main() {Test().test();            // testprint(Test().testInt);    // 1Test().test2();           // test2Test().test3();           // test3
}
复制代码

如果mixin存在冲突的部分,后面会覆盖前面的,没有冲突的则会保留,所以可以存在后面的mixin修改了前面的mixin的一部分逻辑的情况,不需要直接继承即可实现覆盖,避免了更复杂的继承关系

"多重继承"

mixin TestMixin on BaseClass {void init() {print('TestMixin init start');super.init();print('TestMixin init end');}
}mixin TestMixin2 on BaseClass {void init() {print('TestMixin2 init start');super.init();print('TestMixin2 init end');}
}class BaseClass {void init() {print('Base init');}BaseClass() {init();}
}class TestClass extends BaseClass with TestMixin, TestMixin2 {@overridevoid init() {print('TestClass init start');super.init();print('TestClass init end');}
}void main() {TestClass();/// TestClass init start/// TestMixin2 init start/// TestMixin init start/// Base init/// TestMixin init end/// TestMixin2 init end/// TestClass init end
}
复制代码

稍微有点绕,可以看到,这已经事实上达到多重继承才能达到的效果了,写起来比较麻烦,某种程度上也更不容易出错(相对于C++)。。。源码里有最好也最复杂的例子—WidgetsFlutterBinding,它的定义如下:

class WidgetsFlutterBinding extends BindingBase with GestureBinding, ServicesBinding, SchedulerBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {}
复制代码

具体WidgetsFlutterBinding的分析就没啦,自己看源码去吧~~

Flutter mixin用法详解相关推荐

  1. 导出jar插件_Fluttify输出的Flutter插件工程详解

    系列文章: yohom:Fluttify输出的Flutter插件工程详解​zhuanlan.zhihu.com yohom:开发Flutter插件必备原生SDK->Dart接口生成引擎`Flut ...

  2. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  3. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  4. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  5. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  6. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  7. php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy

    Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...

  8. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

  9. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  10. WinDbg用法详解

    WinDbg用法详解 对WinDbg的方方面面作了详细的讲解. 转载于:https://blog.51cto.com/laokaddk/125111

最新文章

  1. nagle算法和延迟ACK
  2. 语音预处理:服务器平台“部署”
  3. 开启Apache mod_rewrite模块(解决404 Not Found)
  4. 2021年中国计算机视觉人才调研开启啦,诚邀各位开发者们参与~
  5. jquery常见获取高度
  6. VMware vsphere 中创建虚拟机的方法
  7. Spark键值对RDD的转化操作
  8. jquery尺寸:宽度与高度
  9. BUAA OO 2019 第一单元作业总结
  10. 灰色系统理论及其应用
  11. java 文件流下载pdf
  12. matlab单项pwm整流电流内环pr控制仿真,基于PR的单相PWM整流器电流控制研究
  13. SD卡和SDHC卡操作
  14. Qt5使用Poppler实现PDF阅读器
  15. 服务器干货分享!做APP服务器怎么选择?
  16. 160亿数据点图表控件LightningChart振动分析可以检测什么?
  17. 港股通与全球一体化投资交易系统实践
  18. 关于所谓U盘有占用空间,却看不到文件的一些看法
  19. Plus版SBOM:流水线物料清单PBOM
  20. IDELAY输入延迟分析

热门文章

  1. vscode settings.json配置
  2. es6箭头函数使用场景导致的一些问题
  3. create-react-app脚手架中配置webpack的方法
  4. 20150914-构建之法:现代软件工程-阅读笔记
  5. 2个版本并存的python使用新的版本安装django的方法
  6. 你一点要认真了解 C++中的模式匹配介绍
  7. py-faster-rcnn +cudnn V5
  8. 面向对象编程(五)——构造方法
  9. cf319.B. Modulo Sum(dp 鸽巢原理 同余模)
  10. Common Lisp