当前位置: 首页 > news >正文

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 类也不能有。

http://www.cnnetsun.cn/news/117031.html

相关文章:

  • MCP协议驱动企业级AI集成:芋道源码的智能化升级实践
  • 终极指南:使用gsplat.js实现高性能3D高斯点云渲染
  • 把CNN和SVR捏在一起做预测这事儿,乍听有点玄乎,实操起来倒挺有意思。咱们今天不整那些虚头巴脑的理论,直接上手撸代码。先甩个模型结构出来镇楼
  • Memobase完整安装指南:构建AI长期记忆系统的7个关键步骤
  • Faiss HNSW性能瓶颈突破:5步诊断与3倍提速优化实战
  • 5个立竿见影的wgpu性能优化技巧:让你的Rust图形应用帧率翻倍
  • 1000 人并发 + 4K 高清,3 大行业案例见证协作效率翻倍
  • 字符串的拼接函数:strcat()
  • GraphRAG-Local-UI终极指南:本地知识图谱构建与智能查询完整教程
  • Messari:Flow 生态 2025 年 Q3 发展概览
  • Draft.js工具栏深度定制:构建企业级富文本编辑器的完整实践
  • 下一个版本EmotiVoice将带来哪些惊喜?
  • 明诺多功能全自动洗地机,适用于超市、地库及商场清洁需求
  • 最近网上爆火的Flowith AI是啥?能否成为下一代AI Agent产品?
  • CesiumJS体素渲染终极指南:3D体积数据可视化完整解析
  • LrcApi终极指南:快速构建专业级歌词同步服务的完整方案
  • DeepSeek-V3.2-Exp推理部署终极指南:从模型文件到生产服务的完整路径
  • CVAT用户权限配置完整教程:从基础到高级的团队协作管理终极指南
  • ADC调试踩坑:一个printf引发的“血案“
  • 关键词:一致性算法;直流微电网;下垂控制;分布式二次控制;电压电流恢复与均分;非线性负载
  • ComfyUI-Manager安全权限终极指南:快速解决权限问题
  • Electronic WeChat个性化配置完全指南:从入门到精通
  • I2C总线:时序结构与数据帧
  • 适合新手的电脑版AI编曲软件快速根据哼唱清唱主旋律作伴奏
  • ZW3D二次开发_分享一个通过命令按钮查找关联API函数的插件
  • 【光照】Unity[光照探针]的作用与工作原理
  • 你有没有想过,像 ChatGPT 这样聪明的 AI,它是怎么“出生”的?
  • 基于单片机的数字电压表设计
  • 强化学习系统性学习笔记(二):策略优化的理论基础与算法实现
  • 基于STM32银行医院柜台叫号排队系统语音播报设计