头条创作挑战赛 本文同步本人掘金平台的文章:https:juejin。cnpost7128957843314573349 推荐使用线上编辑器dartpad。cn进行学习,测试什么是混入Mixin Mixin是一种在多重继承中复用某个类中代码的方法模式。使用with关键字并在其后跟上Mixin类的名字来使用Mixin模式:classDogextendsAnimalwithWalk,Bark{。。。}复制代码怎么使用混入Mixin 实现一个Mixin类,要创建一个继承自Object其没有声明构造函数的类。mixinWalk{boolcanW注意,没有构造函数voidwalk(){print(Icanwalk。)}}复制代码 我们使用关键字mixin来代替class实现混入类。 on关键字(格式:onclassName),指定哪些类可以使用该Mixin类。我们改写下上面的代码,如下:表明Walk类只能被Animal类使用mixinWalkonAnimal{boolcanW注意,没有构造函数voidwalk(){print(Icanwalk。)}}复制代码混入Mixin有什么应用场景 我们举个例子:手机类classPhone{voidstartUp(){print(startup);}voidshutDown(){print(shutdown);}}smswechatclassWechat{voidsms(){print(installwechat);}}smsfacebookclassFacebook{voidsms(){print(installfacebook);}}ios手机classIosPhoneextendsPhone{overridevoidstartUp(){print(iosphonecanstartup);}}android手机classAndroidPhoneextendsPhone{overridevoidstartUp(){print(androidphonecanstartup);}}复制代码 假设现在我有一台iPhone的手机,里面有Wechat和Facebook,我们使用extends来实现,比如:classPhoneextendsWechat,Facebook{}复制代码 明显不行,抛开手机继承功能这个语义话的问题,语法上是不允许多继承的。Dart允许单继承。 我们可以考虑使用混入Mixin。我们来改写下代码:voidmain(){IosPhonenameJimmynewIosPhone();nameJimmy。startUp();iosphonecanstartupnameJimmy。sms();installfacebookAndroidPhonenameIvynewAndroidPhone();nameIvy。startUp();androidphonecanstartupnameIvy。sms();installwechatnameIvy。specialFn();facebookspecialfunction}手机类classPhone{voidstartUp(){print(startup);}voidshutDown(){print(shutdown);}}smswechatmixinWechat{voidsms(){print(installwechat);}}smsfacebookmixinFacebook{voidsms(){print(installfacebook);}voidspecialFn(){print(facebookspecialfunction);}}ios手机classIosPhoneextendsPhonewithFacebook{overridevoidstartUp(){print(iosphonecanstartup);}}android手机classAndroidPhoneextendsPhonewithFacebook,Wechat{overridevoidstartUp(){print(androidphonecanstartup);}}复制代码 细心的读者应该发现了,Wechat和Facebook上都有sms的功能,为什么nameIvy。sms()中打印出来的是installwechat呢?这就涉及到了重名方法处理。重名方法处理 通过上面的代码示例,我们知道:with后面的类会覆盖前面的类的同名函数voidmain(){IosPhonenameJimmynewIosPhone();nameJimmy。startUp();iosphonecanstartupnameJimmy。sms();Ihavemine}smsfacebookmixinFacebook{voidsms(){print(installfacebook);}}ios手机classIosPhonewithFacebook{overridevoidstartUp(){print(iosphonecanstartup);}overridevoidsms(){print(Ihavemine);}}复制代码 我们现在重写sms的方法,然后调用的时候,会调用IosPhone的重写方法。那么我们可以得到:类中重写了Mixin类中的方法,调用类自己的方法 我们总结一下:如果当前使用的类没有重写Mixin类的方法,则调用距离with最远的Mixin类方法;否则,调用重写的方法。 如果读者觉得文章还可以,不防一键三连:关注点赞收藏