[Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明

类创建:abstract(抽象类)、extension(扩展)

1.abstract(抽象类)

  • dart 抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
  • 抽象类通过abstract 关键字来定义。
  • 抽象类不可以被实例化,只有继承他的子类可以。
  • 子类继承抽象类必须实现里面的抽象方法。
  • 抽象类作为接口,必须实现抽象类里面的所有属性和方法。
  • 多态就是父类定义一个属性或者方法,父类不去实现,让子类去实现,这就叫多态。
/** 定义一个Animal 类要求它的子类必须包含eat方法 */

abstract class Animal {
  eat(); //抽象方法   子类中必须实现
  printInfo(){
    print('我是一个抽象类中的普通方法');
  }
}

class Dog extends Animal {
  @override   //覆写抽象父类的方法
  eat(){
    print('小狗在吃骨头');
  }
}

class Cat extends Animal {
  @override
  eat(){
    print('小猫在吃🐟');
  }
}

main(){
  Dog d = new Dog();
  d.eat();   //小狗在吃骨头
  d.printInfo();   //我是一个抽象类中的普通方法

  Cat c = new Cat();
  c.eat();   //小猫在吃🐟
}

2.extension(扩展)

关键词:on 表示针对某一类型的扩展,针对某一类型的实例化对象可以直接调用方法使用。

为现有类扩展没有的方法。

举例:

extension TextOverflowUtil on String {
  String toCharacterBreakStr() {
    if (isEmpty) {
      return this;
    }
    var breakWorkds = '';
    for (var element in runes) {
      breakWorkds += String.fromCharCode(element);
      breakWorkds += '\u200B';
    }
    return breakWorkds;
  }
}

使用:

//引入拓展文件地址
import 'package:**************_ext.dart';

......

Text(
              (title ?? "--").toCharacterBreakStr(),
              style: HYXStyles.blacksBold15,
              overflow: TextOverflow.visible,
            ),

类引入:extends(继承), implements(接口实现), mixin(混入)

1.extends(继承),在flutter中继承是单继承。

  • 子类重写超类的方法要用@override
  • 子类调用超类的方法要用super
  • 子类会继承父类里面可见的属性和方法,但是不会继承构造函数
  • 子类能复写父类的getter 和 setter 方法
  • 子类可以继承父类的非私有变量 
class Person {
  String? name;
  int? age;
  Person(this.name, this.age);

  //思想是私有的,使用_thought 对子类不可见
  String? _thought;
  //计算这个人类是否成年
  bool get isAdult => (age ?? 0) >= 18;

  void run() {
    print("运行 person 类了");
  }
}

class Student extends Person {
  // 子类的构造函数,并使用super 调用了超类的方法, name 必传,age 可以为空, {int? age} 可选的意思
  Student(String name, {int? age}) : super(name, age);

  // 重写父类的方法
  @override
  bool get isAdult => (age ?? 0) > 20;

  @override
  void run() {
    // 如果把这里注释掉,就无法调用到超类的run() 方法了。
    super.run();
    print("运行 student 类了");
  }
  //  子类自己的方法
  void studentRun() {
    print("运行 studentRun 类了");
  }
}

继承的局限在于:在flutter中只能单继承,灵活度不高。所以有后面的这两个implements、和mixin来弥补。

2. implements(接口实现)

可多个接口实现(任何单独的都很苍白,对比才能更立体)。规范定义一个系统的属性和方法的命名,具体实现需要在每一个具体的类中体现,且子类需要全部实现implements后的类的所有属性和方法。结合抽象类示例:

abstract class Run {
  var runValue;

  void runing() {
    print("runing");
  }
}

abstract class Eat {
  void eat();
}

class Person implements Run, Eat {
  @override
  var runValue = 100;

  @override
  void eat() {
    // TODO: implement eat
    print("Person 吃了 ${runValue} 个萝卜");
  }

  @override
  void runing() {
    // TODO: implement runing
    print("Person 跑了 ${runValue} 公里");
  }
}

class Tiger extends Run with Eat {
  // 抽象类中实现的方法
  // 继承抽象类可以不用实现(子类继承父类方法,可以选择是否重新)
  @override
  void runing() {
    // 继承抽象类,可以调用super
    super.runing();
    print("Tiger runing");
  }

  // eat 抽象类中需要实现的方法
  @override
  void eat() {
    print("Tiger eat");
  }
}

void main() {
  Person person = Person();
  person.runing();
  person.eat();

  Tiger tiger = Tiger();
  tiger.runing();
  tiger.eat();
}

接口的局限在于:一个子类必须全部实现所有的属性和方法。mixin可以解决这个问题

3.mixin(混入),在现有类的基础上,引入一些新的变量。

  • 作为mixins 的类只能继承自object,不能继承其他的类。
  • 作为mixins 的类不能有构造函数。
  • 一个类可以mixins 多个mixin 类。
  • mixins 不是继承,也不是接口,而是一种全新的特性。
关键字:

with:子类混入某个类的时候使用

class MixinModel with TextMixin{}

on:定义基于某个类型的mixin

mixin TextMixin1 on BaseMixin{}
最基础的mixin:
// mixin 本身可以是抽象的,可以定义各种方法和属性,等待后续类去实现
mixin TextMixin {
//  定义属性
  var mixinValue = 2;

//  抽象方法
  void mixinTest01();

  void mixinTest02() {
    print("mixinTest02 的输出");
  }
}

class MixinModel with TextMixin{
  @override
  void mixinTest01() {
    // 该函数mixin 定义未实现,混入对象,必须要实现
    print("mixinTest01 需要实现此方法: ${mixinValue}");
  }

}

void main(){
  MixinModel model = MixinModel();
  model.mixinTest01();
  model.mixinTest02();

  print("mixinValue 调用的输出: ${model.mixinValue}");
}

运行结果:

mixin 本身可以是抽象的,可以定义各种的方法和属性,等待后续的类去实现

on 关键字,基于某个类型的mixin

当使用on 关键字(限定类型),则表示该mixin 只能在那个类的子类中使用,这就代表了mixin 中可以调用那个类的方法和属性。

class BaseMixin {
  void method() {
    print("method 的输出");
  }
}

mixin TextMixin1 on BaseMixin {
  void test1() {
    print("test1");
  }

  int testValue = 2;

  void test2() {
    method();
  }

  void test3();
}

class Test extends BaseMixin with TextMixin1 {
  @override
  void test3() {
    // TODO: implement test3

    print("需要实现的 test3");
  }

}

void main() {
  Test test = Test();
  test.test1();
  test.test2();
  test.test3();

  print(test.testValue);
}

运行上面代码:

多个mixin

前面我们学习了简单的mixin,mixin 的限定on 关键字,现在我们来看一下,多个mixin 是怎么实现的。

mixin TextMixin1 {
//  定义属性
  var mixinValue = 1;

//  抽象方法
  void mixinTest01();

  void mixinTest02() {
    print(" TextMixin1 中 mixinTest02  的输出");
  }
}

mixin TextMixin2 {
//  定义属性
  var mixinValue = 2;

  void mixinTest03() {
    print("TextMixin2 中 mixinTest03 的输出");
  }
}

class Test with TextMixin1, TextMixin2 {
  @override
  void mixinTest01() {
    // TODO: implement mixinTest01

    print("TextMixin1 中的抽象方法 mixinTest01 的实现");
  }
}

void main() {
  Test test = Test();
  test.mixinTest01();
  test.mixinTest02();
  test.mixinTest03();
  print(test.mixinValue);
}

运行上面的代码,输出结果如下图:

mixin 怎么实现多继承

dart 是单继承的语言,但是有些时候,我们也需要实现多继承的关系,既然mixin 是dart 语言中的一种新特性,那么我们该怎么使用mixin 来实现多继承的关系呢?这里将揭晓答案,请看代码:

class BaseMixin {
  void init() {
    print("BaseMixin init");
  }

  BaseMixin() {
    init();
  }
}

mixin TextMixin1 on BaseMixin {
  void init() {
    print("TextMixin1 init start");
    super.init();
    print("TextMixin1 init end");
  }
}

mixin TextMixin2 on BaseMixin {
  void init() {
    print("TextMixin2 init start");
    super.init();
    print("TextMixin2 init end");
  }
}

class Test extends BaseMixin with TextMixin1, TextMixin2 {
  @override
  void init() {
    print("Test init start");
    super.init();
    print("Test init end");
  }
}

void main() {
  Test();
}

代码运行,执行结果如下图:

三者可以同时存在于一个类中,前后顺序是:extends>mixins>implements
如果都使用了同一个方法的实现,那么在子类中的这个方法的有效性优先级:mixins>extend>implements, mixins和implements中如果跟了多个,那么后面的会覆盖前面的,没有冲突的,则都会保留,所以会存在后面的会修改掉前面的一部分逻辑代码,不需要直接继承,就可以直接实现覆盖,避免了更复杂的多继承关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/316779.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

activiti流程图+动态表单

使用技术 jeecg-bootactivitivue3form-create 简单效果展示 流程图绘制 审批人配置 动态表单配置 流程审批 流程审批记录 填写表单信息 源码地址 后台:https://gitee.com/houshixin/jmg-boot前端:https://gitee.com/houshixin/jmg-ui

在Linux下配置Apache HTTP服务器

在Linux的世界里,如果说有什么比解决各种“神秘”的故障更让人头疼,那一定就是配置Apache HTTP服务器了。这不是因为Apache有什么问题,而是因为配置它简直就像解谜游戏,一不留神就会让你陷入无尽的纠结。 首先,你需要…

数据库的数据类型

文章目录 前言一、数据类型数据类型分类数值类型bit类型小数类型floatdecimal 字符串类型charvarcharchar和varchar比较 日期和时间类型enum和set 前言 一、数据类型 数据类型分类 数值类型 下面我们来创建一个表,表中创建一个tinyint类型的数据。当我们不指定tiny…

记录汇川:H5U与Factory IO测试12

主程序: 子程序: IO映射 子程序: 辅助出料 子程序: 自动程序 Factory IO配置: 实际动作如下: Factory IO测试12

2023一带一路暨金砖国家技能发展与技术创新大赛“网络安全”赛项省选拔赛样题卷②

2023金砖国家职业技能竞赛"网络安全" 赛项省赛选拔赛样题 2023金砖国家职业技能竞赛 省赛选拔赛样题第一阶段:职业素养与理论技能项目1. 职业素养项目1. 职业素养项目2. 网络安全项目3. 安全运营 第二阶段:安全运营项目1. 操作系统安全配置与加…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式培训笔记,嵌入式硬件,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_3980490…

深入理解Lock Support

第1章:引言 大家好,我是小黑,今天咱们要聊聊Lock Support。Lock Support是Java并发编程的一块基石,它提供了一种非常底层的线程阻塞和唤醒机制,是许多高级同步工具的基础。 为什么要关注Lock Support?线程…

七通道NPN 达林顿管GC2003,专为符合标准 TTL 而制造

GC2003 内部集成了 7 个 NPN 达林顿晶体管,连接的阵列,非常适合逻辑接口电平数字电路(例 如 TTL,CMOS 或PMOS 上/NMOS)和较高的电流/电压,如电灯电磁阀,继电器,打印机或其他类似的负…

Java项目:05 停车管理系统

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 课题意义: 随着时代和科技的进步,人们的生活水平越来越高,私家车的数量不断上涨,随之产生了一些问题&…

力扣:209.长度最小的子数组

1.题目分析: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 …

电子学会2023年12月青少年软件编程(图形化)等级考试试卷(四级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(四级) 分数:100 题数:24 一、单选题(共10题,共30分) 1. 运行下列程序,输入“abcdef”,程序结束后,变量“字符串”是?( )

PLAN B KRYPTO ASSETS GMBH amp; CO. KG 普兰资产管理公司

引领加密技术不断演进 PLAN B KRYPTO ASSETS普兰资产管理以其独创的「Trident Strategy三叉戟模型」技术为基础,持续推动加密技术的发展,打造 Schutz(舒茨盾) AI 金融隐私匿名公链。致力于提供高效的技术服务,基于机构…

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路…

【数字图像处理】素描风格变换(二)—— 代码实现

在绘画风格中,素描风格是一种以黑白灰(或单色)色调为主的绘画风格,注重表现物体的轮廓、结构、明暗关系等细节。在数字图像处理中,素描风格变换是一种图像风格变换的过程,用于呈现素描的视觉效果。本文主要记录使用紫光同创 PGL22G 平台,实现素描风格变换的主要代码。 目…

SwiftUI之深入解析高级布局的实战教程

一、自定义动画 首先实现一个圆形布局的视图容器 WheelLayout: struct ContentView: View {let colors: [Color] [.yellow, .orange, .red, .pink, .purple, .blue, .cyan, .green]var body: some View {WheelLayout(radius: 130.0, rotation: .zero) {ForEach(0.…

如何在使用JetBrains IDE时文本编辑更高效?这个IdeaVim好用

IdeaVim 插件已经发布一段时间了,它帮助开发者利用 Vim 的强大功能扩展 JetBrains IDE。JetBrains 内部有一个专属团队维护此插件,这为您提供了两项优势:以键盘为中心的编辑器和 IDE 的支持。 Vim为文本中的跳转和修改带来了许多灵活性&…

最新靠谱可用的-Mac-环境下-FFmpeg-环境搭建

最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事,Google 了 N 篇文章竟然没有一篇是可以跑起来的! 少部分教程是给出了自我矛盾的配置(是的,按照贴出来的代码和配置,他自己都跑不起来),大部…

[Altium Designer] AD PCB相同模块的布局步骤

针对原理图完全相同的模块布局布线很有帮助;一定要对应模块相同操作才具有可行性。 1、原理图中选取一路模块的元器件,快捷键【T→S】即可在对应的PCB中选取对应的元器件;跳转到PCB,快接方式改变右边属性,【ctrla】 …

代币合约 ERC20 Token接口

代币合约 在以太坊上发布代币就要遵守以太坊的规则,那么以太坊有什么规则呢?以太坊的精髓就是利用代码规定如何运作,由于在以太坊上发布智能合约是不能修改和删除的,所以智能合约一旦发布,就意味着永久有效,不可篡改…

【信号与系统】【北京航空航天大学】实验一、信号的MATLAB表示及信号运算

一、实验目的 1、初步掌握 MATLAB 仿真软件的使用; 2、学习使用 MATLAB 产生基本时域信号,并绘制信号波形; 3、学习利用 MATLAB 实现信号的基本运算; 4、利用 MATLAB 分析常用的连续时域信号。 二、实验内容 1、 生成连续信号 …