美文网首页
Dart简介3--mixin

Dart简介3--mixin

作者: 逃离_102 | 来源:发表于2022-09-22 22:41 被阅读0次

说明

Dart 是不支持多继承的,但是它支持 mixin,简单来讲 mixin 可以 “组合” 多个类,这样就极大的减少了代码冗余。mixin是面向对象程序设计语言中的类,提供了方法的实现。其他类可以访问mixin类的方法、变量而不必成为其子类。简而言之,mixins是普通的类,我们可以从中扩展方法(或变量)而不扩展类。

示例

定义一个 Person 类,实现吃饭、说话、走路和写代码功能,同时定义一个 Dog 类,实现吃饭、和走路功能。我们定义了几个 mixin,然后通过 with 关键字将它们组合成不同的类。有一点需要注意:如果多个mixin 中有同名方法,with 时,会默认使用最后面的 mixin 的,mixin 方法中可以通过 super 关键字调用之前 mixin 或类中的方法

class Person {
  say() {
    print('say');
  }
}

mixin Eat {
  eat() {
    print('eat');
  }
}

mixin Walk {
  walk() {
    print('walk');
  }
}

mixin Code {
  code() {
    print('key');
  }
}

class Dog with Eat, Walk{}
class Man extends Person with Eat, Walk, Code{}

从用法有点类似于Java中的多接口实现,不同点在于,mixin可以有默认实现,当然Java8中也有了这个功能。

mixin之线性化

在上面的示例中,我们发现with关键字后有多个类。那么这里就产生了一个问题——如果with后的多个类中有相同的方法,那么当调用该方法时,会调用哪个类里的方法尼?由于距离with关键字越远的类会重写前面类中的相同方法,因此分为以下两种情况:

  • 如果当前使用类重写了该方法,就会调用当前类中的方法。
  • 如果当前使用类没有重写了该方法,则会调用距离with关键字最远类中的方法。
//BindingBase
abstract class BindingBase {
  void initInstances() {
    print("BindingBase——initInstances");
  }
}
//GestureBinding
mixin GestureBinding on BindingBase{
  @override
  void initInstances() {
    print("GestureBinding——initInstances");
    super.initInstances();
  }
}
//RendererBinding
mixin RendererBinding{
  @override
  void initInstances() {
    print("RendererBinding——initInstances");
    super.initInstances();
  }
}
// WidgetsBinding
mixin WidgetsBinding on BindingBase{
  @override
  void initInstances() {
    print("WidgetsBinding——initInstances");
    super.initInstances();
  }
}
//WidgetsFlutterBinding
class WidgetsFlutterBinding extends BindingBase
    with GestureBinding, RendererBinding, WidgetsBinding {
    static WidgetsBinding ensureInitialized() {
      return WidgetsFlutterBinding();
    }
}
//main
main(List<String> arguments) {
  var binding = WidgetsFlutterBinding();
  binding.initInstances();
}

WidgetsFlutterBinding中并没有重写initInstances方法,那么就以最右边重写该方法的类——WidgetsBinding为主。那么结果应该如下:WidgetsBinding——initInstances
其实结果是:
WidgetsBinding——initInstances RendererBinding——initInstances GestureBinding——initInstances BindingBase——initInstances
这是为什么尼?仔细一点就可以发现,我们在WidgetsBinding、RendererBinding及GestureBinding中都调用了父类的initInstances方法,也因此会一级一级往上调用。如果我们取消该句代码,则会终止这种调用方式。这就是线性化。

先就写这么多,下面就得边学习边总结,有什么不对的地方,欢迎留言讨论,谢谢!

相关文章

  • Dart简介3--mixin

    说明 Dart 是不支持多继承的,但是它支持 mixin,简单来讲 mixin 可以 “组合” 多个类,这样就极大...

  • Flutter 代码规范整理

    Dart 语法简介 Flutter是使用Dart语言开发的。Dart语言是基于类的纯面向对象语言。Dart 中的所...

  • 2019-04-20

    Dart语言简介 https://book.flutterchina.club/chapter1/dart.htm...

  • Flutter-Dart基础语法入门

    Dart语法基础 Dart语言简介 Dart是Google推出的一门编程语言,最初是希望取代Javascript运...

  • Dart 笔记 1 - 基础

    参考: Dart2 中文文档 Dart 语言简介 两个空格作为缩进。语句结束需要分号。 print 在 dart:...

  • Dart - Dart 语言介绍

    在线练习 Dart 在线练习 - DartPad 一些文章 Dart 开发语言概览Dart语言简介 30分钟掌握D...

  • Dart语言简介

    最新Dart2.7版本 mixins,代码重用方法。PilotedCraft拥有Piloted的所有字段和方法 接...

  • Dart语言简介

    1.3 Dart语言简介 在跨平台开领域被 JS 一统天下的今天,Dart 语言的出现无疑是一股清流。作为后来者,...

  • Dart语言简介

    学习使用,研究完就删原文地址Dart语言简介在之前我们已经介绍过Dart语言的相关特性,读者可以翻看一下,如果你熟...

  • Dart语言简介

    Dart的设计目标应该是既对标Java,也对标JavaScript,Dart在静态语法方面和Java非常相似,如类...

网友评论

      本文标题:Dart简介3--mixin

      本文链接:https://www.haomeiwen.com/subject/cajgortx.html