[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 {@overrideeat(){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);// 重写父类的方法@overridebool get isAdult => (age ?? 0) > 20;@overridevoid 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 {@overridevar runValue = 100;@overridevoid eat() {// TODO: implement eatprint("Person 吃了 ${runValue} 个萝卜");}@overridevoid runing() {// TODO: implement runingprint("Person 跑了 ${runValue} 公里");}
}class Tiger extends Run with Eat {// 抽象类中实现的方法// 继承抽象类可以不用实现(子类继承父类方法,可以选择是否重新)@overridevoid runing() {// 继承抽象类,可以调用supersuper.runing();print("Tiger runing");}// eat 抽象类中需要实现的方法@overridevoid 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{@overridevoid 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 {@overridevoid test3() {// TODO: implement test3print("需要实现的 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 {@overridevoid mixinTest01() {// TODO: implement mixinTest01print("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 {@overridevoid init() {print("Test init start");super.init();print("Test init end");}
}void main() {Test();
}

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSG StatsHandler 初步学习

osg为视景器的使用和调试提供了丰富的辅助组件&#xff0c;它们主要是以osg::ViewerBase的成员变量或交互事件处理器(osgGA::GUIEventHandler)的形式出现。osgViewer::StatsHandler、osg::Stats类就是其中的两个经常用到的辅助组件。 #include<osgViewer/Viewer> #inclu…

CCF模拟题 202305-1 重复局面

试题编号&#xff1a; 202305-1 试题名称&#xff1a; 重复局面 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以用…

linux软件安装(yum命令)

1.Linux系统的应用商店 操作系统安装软件有许多种方式&#xff0c;一般分为&#xff1a; 下载安装包自行安装 如win系统使用exe文件、msi文件等如mac系统使用dmg文件、pkg文件等 系统的应用商店内安装 如win系统有Microsoft Store商店如mac系统有AppStore商店 Linux命令行…

【Databend】行列转化:一行变多行和简单分列

文章目录 数据准备和需求生成序列和分隔函数根据分隔符变多行JSON 数据简单分列总结 数据准备和需求 行列转化在实际工作中很常见&#xff0c;其中最常见的有一行变多行&#xff0c;有下面一份数据&#xff1a; drop table if exists fact_suject_data; create table if not …

高效便捷的远程管理利器——Royal TSX for Mac软件介绍

Royal TSX for Mac是一款功能强大、操作便捷的远程管理软件。无论是远程桌面、SSH、VNC、Telnet还是FTP&#xff0c;用户都可以通过Royal TSX轻松地远程连接和管理各种服务器、计算机和网络设备。 Royal TSX for Mac提供了直观的界面和丰富的功能&#xff0c;让用户能够快速便…

09-Python服务链路追踪案例

skyWalking Python agent requires SkyWalking 8.0 and Python 3.7 # 将django包导入 ~$ cd /apps ~$ tar xf django-test.tgz ~$ cd django-test# 安装模块 ~$ apt install python3-pip ~$ pip3 install -r requirements.txt# 创建django项目mysite ~$ django-admin startpro…

手把手教你用 Stable Diffusion 写好提示词

Stable Diffusion 技术把 AI 图像生成提高到了一个全新高度&#xff0c;文生图 Text to image 生成质量很大程度上取决于你的提示词 Prompt 好不好。 前面文章写了一篇文章&#xff1a;一份保姆级的 Stable Diffusion 部署教程&#xff0c;开启你的炼丹之路 本文从“如何写好…

网络正常运行时间监控工具

正常运行时间是衡量系统可靠性的指标&#xff0c;表示为机器工作和可用时间的百分比。当提到 IT 网络时&#xff0c;正常运行时间是衡量网络设备、网站和其他服务的可用性的指标。网络正常运行时间通常以百分位数来衡量&#xff0c;例如“五个 9”&#xff0c;这意味着系统在 9…

宝塔面板安装MySQL8数据库

第一步&#xff1a;搜索mysql 第二步: 点击安装 我这里选择安装8版本 第三步&#xff1a;给宝塔配置mysql防火墙 第四步&#xff1a;修改数据库密码 第五步&#xff1a;想要使用navicat连接 需要修改root的权限 &#xff08;1&#xff09;使用secureCRT先登录mysql (2) 输入u…

计算机毕业设计-----SSH企业人力资源管理系统

项目介绍 企业人力资源管理系统&#xff0c;分为超级管理员与普通管理员两种角色,超级管理员可以对普通管理员进行添加、删除等操作&#xff1b; 超级管理员主要功能有&#xff1a; 部门管理、员工管理、招聘管理、培训管理、奖惩管理、薪资管理、用户信息修改、系统管理&…

【idea】idea插件编写教程,博主原创idea插件 欢迎下载

前言&#xff1a;经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参&#xff0c; 例如日常开发中 我们使用Objects.equals去比较 status(入参)&#xff0c;statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() &#xff0c;再比…

【项目管理】CMMI-风险与机会管理过程

1、文档结构 2、风险与机会概率 风险与机会概率指的是风险与机会实际发生的可能性。可以用自然语言术语来映射数字概率范围。下表列出了七段概率分级中自然语言术语和数字概率范围映射关系。注意&#xff0c;用来计算的概率值等于概率范围的中间值取整。有了映射表格的帮助&am…

VirtualBox安装linuxmint-21.2虚拟机并配置网络

VirtualBox安装linuxmint-21.2虚拟机并配置网络 适用于在VirtualBox平台上安装linuxmint-21.2虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径Oracle VM VirtualBoxVirtualBox-7.0.12-159484D:\softwareCentOS7CentOS-7.9.2009E:\…

将WebGL打包的unity项目部署至Vue中

一、webgl打包 创建一个空项目&#xff08;或者直接使用现成的项目都可以&#xff09;这里以该空项目为例子 注意&#xff1a; 如果你的unity项目中有文字&#xff0c;不需要使用unity默认的字体&#xff0c;需要更改它的字体&#xff0c;否则在最后生成的页面中会显示不出来…

Linux:linux计算机和windows计算机 之间 共享资源

在前面章节已经介绍过&#xff0c;NFS用于Linux系统之间的文件共享&#xff0c;windows 并不知道 NFS &#xff0c;而是使用 CIFS (Common Internet File System) 的协议机制 来 “共享” 文件。在1991年&#xff0c;Andrew Tridgell 通过逆向工程 实现了 CIFS 协议&#xff0c…

Kubernetes(K8S)云服务器实操TKE

一、 Kubernetes(K8S)简介 Kubernetes源于希腊语,意为舵手,因为首尾字母中间正好有8个字母,简称为K8S。Kubernetes是当今最流行的开源容器管理平台,是 Google 发起并维护的基于 Docker 的开源容器集群管理系统。它是大名鼎鼎的Google Borg的开源版本。 K8s构建在 Docker …

怎样的摆渡系统,能实现安全可管控的跨网数据传输?

大数据时代&#xff0c;数据在流通与传输的过程中&#xff0c;更需要注意到数据的安全防护&#xff0c;护航数据价值。“让数据主宰一切的隐忧”&#xff0c;数字战争的时代&#xff0c;各国早已认识到网络安全愈发重要&#xff0c;数据也成为各国发展的重要武器。 出于安全性和…

软考高级系统架构设计师考试经验分享

文章目录 1. 软考介绍&#xff08;1&#xff09;什么是软考&#xff08;2&#xff09;软考的作用&#xff08;3&#xff09;软考各科目的难度&#xff08;4&#xff09;考试时间&#xff08;5&#xff09;考试形式 2.系统架构设计师备考经验&#xff08;1&#xff09;辅导资料&…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑥

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码进行测试…

智能分析网关V4基于AI视频智能分析技术的周界安全防范方案

一、背景分析 随着科技的不断进步&#xff0c;AI视频智能检测技术已经成为周界安全防范的一种重要手段。A智能分析网关V4基于深度学习和计算机视觉技术&#xff0c;可以通过多种AI周界防范算法&#xff0c;实时、精准地监测人员入侵行为&#xff0c;及时发现异常情况并发出警报…