【Flutter】Dart 面向对象 ( mixins 特性 )

举报
韩曙亮 发表于 2022/01/11 00:02:56 2022/01/11
【摘要】 文章目录 一、mixins 简介二、mixins 判定示例二、mixins 示例四、 相关资源 一、mixins 简介 mixins 作用 : mixins 是 D...





一、mixins 简介



mixins 作用 : mixins 是 Dart 的重要特性 ;

  • 添加特性 : mixins 可以为类添加一些特性 ;

  • 重构代码 : mixins 是多个类层次结构中重构代码的一种途径 ;


mixins 使用 : 在 with 关键字后跟上若干 mixin 名称 , 如果有多个使用逗号分隔 ;

with 的位置 : 在 extends 关键字之后 , mixin 名称之前 ;


mixins 实现要素 ★ : 满足下面三种要求的类就是 mixins ;

  • ① 继承 Object : 创建一个继承自 Object 的子类 , 不能继承其它类 ;

  • ② 无构造方法 : 不能声明构造方法 , 所有的构造方法都不声明 ( 包括命名 , 工厂 , 普通构造方法 ) ;

  • ③ 无 super 调用 : 不能通过 super 调用父类方法 ;

抽象类 和 普通类 都可以是 mixins ;





二、mixins 判定示例



判定下面的 Student2 , AbstractPerson , Student3 , Student4 哪个是 mixins ;

// 使用工厂构造方法实现单例模式
// 工厂构造方法就是单例模式
// 工厂构造方法作用是返回之前已经创建的对象 , 之前创建对象时需要缓存下来 ;
class Student2{
  // 静态成员
  static Student2 instace;

  // 工厂构造方法
  factory Student2(){
    if(instace == null){
      // 调用命名构造方法创建 Student2 对象
      instace = Student2.init();
    }
    // 返回单例对象
    return instace;
  }

  // 命名构造方法
  Student2.init();
}

// 定义抽象类 ★★
abstract class AbstractPerson{

  // 抽象类中可以定义没有方法体的方法
  void log();

  // 抽象类中可以包含有方法体的方法
  void log2(){
    print("AbstractPerson");
  }

}

// 继承抽象类 , 必须实现抽象类中的抽象方法
class Student3 extends AbstractPerson{

  @override
  void log() {
    print("Student3");
  }

}

// 抽象类继承抽象类 , 不必实现抽象类中的抽象方法
abstract class Student4 extends AbstractPerson{

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

Student2 有构造函数 , 不是 mixins ;

AbstractPerson 符合 mixins 三个条件 , 是 mixins ; 抽象类也可以是 mixins ;

Student3 不是继承自 Object , 不是 mixins ;

Student4 不是继承自 Object , 不是 mixins ;





二、mixins 示例



代码示例 : 通过 mixins 为 Student5 类添加了 AbstractPerson 特征 , 在开发中为现有的类赋予已经存在的 mixins 类的特性 ;

// 定义 Dart 类
// 与 Java 语言类似, 所有的类默认继承 Object 类
class Person{

  // 定义变量
  String name;
  int age;

  // 私有字段
  int _achievement;

  // 标准构造方法, 下面的方法是常用的构造方法写法
  Person(this.name, this.age);

  // get 方法 : 设置私有字段 achievement 的 get 方法,
  //            让外界可以访问 Person 对象的 _achievement 私有成员
  int get achievement => _achievement;

  // set 方法 : 设置私有字段 achievement 的 set 方法,
  //            让外界可以设置 Person 对象的 _achievement 私有成员值
  set achievement(int achievement){
    _achievement = achievement;
  }

  // 静态方法 , 通过类名调用
  static log(){
    print("log");
  }

  // 重写父类的方法
  @override
  String toString() {
    return "$name : $age";
  }
}

// 定义抽象类
abstract class AbstractPerson{

  // 抽象类中可以定义没有方法体的方法
  void log();

  // 抽象类中可以包含有方法体的方法
  void log2(){
    print("AbstractPerson");
  }

}

// ★★ 通过 mixins 为 Student5 类添加了 AbstractPerson 特征
// ★★ 在开发中为现有的类赋予已经存在的 mixins 类的特性
class Student5 extends Person with AbstractPerson{
  Student5(String name, int age) : super(name, age);

  @override
  void log() {
    // TODO: implement log
  }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60




四、 相关资源



参考资料 :


博客源码下载 :

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/113932843

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。