实践类工作经常会遇到这样的问题,有些概念会用不会说,最近在学习Dart,遇到mixin便是如此。读了几篇网文总觉得良莠不齐,一群码友也说越读越懵,索性静下心来重新出发,一点一滴地弄明白。记录下来分享给大家,咱不说别人文笔不好、也不多举例子以至忘了初心,咱就看能不能以最直观的示例和最直白的讲解达到快速理解mixin的目的。

Mix in: (Phrasal Verb) Mix something in/with something. To add one substance to others, especially in cooking.

-- Oxford Advanced American Dictionary

Mix in本意主要是指烹饪时将一种东西混进另一种东西,比如打个鸡蛋,放点儿盐,一起搅。把这个概念搬到Dart这门单继承的面向对象语言中来又是几个意思呢?

根子就在单继承上,这可以说是现代编程语言的“政治正确”,但它在带来好处的同时也限制了想象空间。废话少说,以码服人:

abstract class DeveloperBase {
void code();
} class FrontEndDeveloper extends DeveloperBase {
void code() => print('我在帮组里小姐姐写代码');
} mixin Zhuangbility on FrontEndDeveloper {
@override
void code() => print('写代码讲究的是情怀'); void operateDatabase() => print('大不了老子删库跑路');
} class FullStackDeveloper extends FrontEndDeveloper with Zhuangbility {} void main() {
FullStackDeveloper fullStackDeveloper = FullStackDeveloper();
fullStackDeveloper.code();
fullStackDeveloper.operateDatabase();
}

首先我们笼统地定义了一个程序员基类DeveloperBase,程序员写程序,天经地义,没啥好说的。然后我们基于DeveloperBase定义了只要有机会就喜欢帮小姐姐干活儿的前端程序员类FrontEndDeveloper

现在,我们实际上就可以用FrontEndDeveloper来干活儿了,但是单就一个前端程序员,刷子毕竟不够,假如我们需要一个能够主持全面工作的全栈程序员,咋整?定义一个全栈程序员类FullStackDeveloper,不管它继承自DeveloperBase还是FrontEndDeveloper,似乎都不够;定义一个后端程序员类BackEndDeveloperFullStackDeveloper来继承,又是鱼和熊掌不可兼得的问题,毕竟单继承机制不给你这个想象空间。

所以,这种时候就得换个思路了。用mixin来声明一种混入,为了避免造成困扰,咱不叫它BackEndDeveloper而命名为高阶能力Zhuangbility,将一组新的技能混入FrontEndDeveloper,然后就可以声明前端程序员出身、带有高阶能力,既能写代码又会玩弄数据库的FullStackDeveloper了。

> dart main.dart ↙
写代码讲究的是情怀
大不了老子删库跑路

mixin很难吗?的更多相关文章

  1. 转:Eric Lippert:阅读代码真的很难

    转自:http://blog.jobbole.com/438/ 相关文章 微软资深软件工程师:阅读代码真的很难(第2篇) 阅读优秀代码是提高开发人员修为的一种捷径 学会阅读源代码 如何阅读大型代码库? ...

  2. 函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网

    函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网 函数式编程很难,这正是你要学习它的原因 156 次分享 新浪微博 腾讯微博 Tweet 人人网 QQ空间 很奇怪不是,很少有人每天都使用函数 ...

  3. Scala很难!

    Scala很难! 本文是从 Yes, Virginia, Scala is hard 这篇文章翻译而来. 首先要说的是,我是一个Scala粉丝,我作为一个Scala语言的倡导者差不多有5年历史了.我写 ...

  4. UI培训就业会很难吗

    众所周知UI是研究人机交互的学科,他是从互联网发展而来的,单从目前它的应用领域来看,主要应用于软件.互联网.移动智能设备.游戏和虚拟现实影音方面.这些都是新兴的热门方向和活跃领域.目前人才缺口和社会需 ...

  5. 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备

    在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...

  6. No bean named 'xxxxx' is defined异常,已解决,这个坑很难发现,你get了吗

    出现No bean named 'xxxxx' is defined异常 没有定义名为xxx的bean 如果你的代码写的都对,根本问题只有一个地方出错了,那就是你的 basePackage=的包名路径 ...

  7. js混淆加密,通过混淆Js代码让别人(很难)无法还原

    js混淆加密,通过混淆Js代码让别人(很难)无法还原   使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密 ...

  8. 关于UIScrollView有些你很难知晓的崩溃情形

    关于UIScrollView有些你很难知晓的崩溃情形 为了实现以下的功能(按钮之间的切换效果): 简短的代码如下: // // RootViewController.m // BUG // // Co ...

  9. 0302IT行业虽吃香,能完全享受这块“香"的也很难

    面对现今严峻的就业形势,越来越多的人希望通过职业技能培训或者学历提升来提高自己的综合技能以便能够顺利地应聘到自己理想中的工作. 在2014年十大最热门行业和职业排行榜中IT行业最吃香.在十大行业里,I ...

随机推荐

  1. Linux学习_菜鸟教程_3

    我是在UBANTO上运行Linux的,开机启动时按下shift或者Esc都不能进入到grub,没有百度到可靠的教程. 暂时先这样吧.免得我把系统搞坏了,先学点实用的知识~~ Next Chapter

  2. DHCP服务器搭建

    一.服务端安装配置 1.安装dhcp相关软件包 执行命令:yum install dhcp dhcp-devel -y #通过yum安装dhcp软件包 2.编辑配置dhcp的配置文件,文件路径:/et ...

  3. Inception V1、V2、V3和V4

    Inception模块分为V1.V2.V3和V4. V1(GoogLeNet)的介绍 论文:Going deeper with convolutions 论文链接:https://arxiv.org/ ...

  4. 键盘优雅弹出与ios光标乱飘解决方案

    前言 在移动开发中,会遇到这样的情况,比如说有一个输入框在最底部的时候,我们弹起输入框,输入框不会在输入键盘上. 说明白简单点就是,输入框被键盘挡住了.而且在原生中,输入框应该正好在输入键盘上,但是h ...

  5. Asp.Net Core 3.0 Kestrel服务器下 高性能 WebSocket Server

    最近研究.net core 的各种高性能类型,内存池之类的东西,基于kestrel 服务器的websocket ,写个例子练下手 把原生的Websocket用ArrayPool<T>,Me ...

  6. 初探ASP.NET Core 3.x (1) - 关于ASP.NET Core

    I 什么是ASP.NET Core ASP.NET is an open source web framework, created by Microsoft, for building modern ...

  7. 数字任意组合 - gcd

    链接:https://www.nowcoder.com/acm/contest/160/A来源:牛客网 题目描述有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an ...

  8. Webpack实战(一):Webpack打包工具安装及参数配置

    为什么要模块化 javascript跟其他开发语言有很多的区别,其中一个就是没有模块化概念,如果一个项目中有多个js文件,我们只能通过script标签引入的方式,把一个个js文件插入到页面,这种做法会 ...

  9. ThinkPad全家族机型对比

    如图所示

  10. 10、python函数

    前言:本文主要介绍python函数的定义和调用.函数的参数.函数的作用域.内置函数. 一.函数的定义和调用 1.函数的作用 对特定的一些功能进行封装,提高代码的重用率,进而提升开发的效率,格式: de ...