news 2026/4/16 14:14:38

Android学Dart学习笔记第十九节 类-混入Mixins

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android学Dart学习笔记第十九节 类-混入Mixins

Mixins 就像是可插拔的功能模块,可以给多个不同的类批量添加相同的功能实现,而不需要这些类有共同的父类。

要使用mixin功能,请使用with关键字,后跟一个或多个mixin名称。下面的例子展示了两个使用mixins的类(或者它们是mixins的子类):

classMusicianextendsPerformerwithMusical{// ···}classMaestroextendsPersonwithMusical,Aggressive,Demented{Maestro(String maestroName){name=maestroName;canConduct=true;}}

要定义一个mixin,使用mixin声明。在需要同时定义mixin和类的罕见情况下,可以使用mixin类声明。

mixin和mixin类不能有extends子句,并且不能声明任何生成构造函数。
声明案例如下:

mixinMusical{bool canPlayPiano=false;bool canCompose=false;bool canConduct=false;voidentertainMe(){if(canPlayPiano){print('Playing piano');}elseif(canConduct){print('Waving hands');}else{print('Humming to self');}}}

Specify members a mixin can call on itself

指定mixin可以调用自身的成员

有时,mixin依赖于能够调用方法或访问字段,但不能自己定义这些成员(因为mixin不能使用构造函数的参数来实例化自己的字段)。

下面几节将介绍确保mixin的任何子类定义mixin行为所依赖的任何成员的不同策略。

Define abstract members in the mixin

在mixin中声明抽象方法会强制任何使用mixin的类型定义其行为所依赖的抽象方法。

mixinMusician{voidplayInstrument(String instrumentName);// Abstract method.voidplayPiano(){playInstrument('Piano');}voidplayFlute(){playInstrument('Flute');}}classVirtuosowithMusician{@overridevoidplayInstrument(String instrumentName){// Subclass must define.print('Plays the $instrumentName beautifully');}}
Mixin 可以定义抽象成员,访问子类的状态

下面的例子可以应用于任何带有[name]属性的类型,并提供实现了[hashCode]和运算符‘ == ’。

mixinNameIdentity{Stringgetname;@overrideintgethashCode=>name.hashCode;@overridebooloperator==(other)=>otherisNameIdentity&&name==other.name;}classPersonwithNameIdentity{finalString name;Person(this.name);}

Implement an interface

与声明mixin抽象类似,在不实际实现接口的同时在mixin上放置一个实现子句也将确保为mixin定义任何成员依赖项。

abstractinterfaceclassTuner{voidtuneInstrument();}mixinGuitaristimplementsTuner{voidplaySong(){tuneInstrument();print('Strums guitar majestically.');}}classPunkRockerwithGuitarist{@overridevoidtuneInstrument(){print("Don't bother, being out of tune is punk rock.");}}

Use the on clause to declare a superclass

on 子句的作用是定义 super 调用所解析的类型。因此,只有当你在 mixin 中需要进行 super 调用时才应该使用它。

on 子句强制任何使用该 mixin 的类也必须是 on 子句中类型的子类。这确保了如果 mixin 依赖于超类中的成员,那么在使用 mixin 的地方这些成员是可用的。

如果M是个mixin同时on了A,如果你想在B类中混入M,那么B必须是A的子类。

classMusician{musicianMethod(){print('Playing music!');}}mixinMusicalPerformeronMusician{performerMethod(){print('Performing music!');super.musicianMethod();}}classSingerDancerextendsMusicianwithMusicalPerformer{}main(){SingerDancer().performerMethod();}

class, mixin, or mixin class?

mixin class声明需要至少3.0的语言版本。
Mixin 声明定义一个 mixin。class声明定义一个类。Mixin class声明定义一个既可以作为普通类使用,又可以作为 mixin 使用的类,具有相同的名称和相同的类型。

mixinclassMusician{// ...}classNovicewithMusician{// Use Musician as a mixin// ...}classNoviceextendsMusician{// Use Musician as a class// ...}

适用于类或 Mixin 的任何限制也适用于 Mixin 类:

Mixin 不能有 extends 或 with 子句,所以 Mixin 类也不能有。
类不能有 on 子句,所以 Mixin 类也不能有。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 7:45:04

VMD-SSA-LSTM与EEMD优化算法在多输入单输出时间序列预测中的应用

VMD-SSA-LSTM变分模态分解-麻雀优化长短期记忆网络 适用于 多输入单输出预测,时间序列预测 通过VMD对功率序列进行分解,然后对分解分量逐一建模进行ssa-LSTM预测。 者可从vmd替换为eemd或进行优化寻参,ssa替换为其他优化算法等方面进行改进 m…

作者头像 李华
网站建设 2026/4/16 9:25:31

The Mirror协作革命:如何让团队开发像在线文档一样流畅?

想象一下这样的场景:你和团队成员正在同时编辑同一个3D空间,你调整物体的位置时,他们正在修改材质属性——没有冲突提示,没有合并对话框,一切修改实时同步,就像你们在同一个Google文档中协作一样自然。这就…

作者头像 李华
网站建设 2026/4/16 11:14:06

fmtlib高效缓冲区管理终极指南:从零掌握现代格式化核心技术

在C高性能编程领域,fmtlib以其卓越的性能表现脱颖而出。作为现代格式化库的代表,它通过精心设计的缓冲区管理机制,在保证类型安全的同时实现了接近原生代码的执行效率。本文将深入剖析fmtlib底层缓冲区实现原理,带你掌握构建高效C…

作者头像 李华
网站建设 2026/4/16 11:14:45

怎么查看电脑显卡显存?3种简单方法教会你

显卡显存(Video RAM, VRAM)是计算机显卡的重要组成部分,它在图形处理和渲染过程中起着至关重要的作用。显存的大小和性能直接影响到图像处理的速度、显示效果的质量以及运行游戏和专业应用时的流畅度。那么,电脑显卡显存怎么看呢&…

作者头像 李华
网站建设 2026/4/16 11:14:40

【每日算法】LeetCode 76. 最小覆盖子串

对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习…

作者头像 李华