Dart中的抽象类、多态、以及接口

一、Dart中的抽象类

Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。

  1、抽象类通过abstract 关键字来定义

  2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。

  3、如果子类继承抽象类,必须得实现里面的抽象方法

  4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。

  5、抽象类不能被实例化,只有继承它的子类可以

extends抽象类 和 implements的区别:

  1、如果要复用抽象类里面的方法,并且要用抽象方法约束自类的话我们就用extends继承抽象类

  2、如果只是把抽象类当做标准的话我们就用implements实现抽象类

案例:定义一个Animal 类要求它的子类必须包含eat、run方法

1abstract class Animal{ 2 eat(); //抽象方法 3 run(); //抽象方法 4 printInfo(){ 5 print('我是一个抽象类里面的普通方法'); 6 } 7} 8 9//继承的子类必须包含eat和run方法 10class Dog extends Animal{ //鼠标放在Dog上,点击快速修复 11 @override 12 eat() { 13 print('小狗在吃骨头'); 14 } 15 16 @override 17 run() { 18 // TODO: implement run 19 print('小狗在跑'); 20 } 21} 22class Cat extends Animal{ 23 @override 24 eat() { 25 // TODO: implement eat 26 print('小猫在吃老鼠'); 27 } 28 29 @override 30 run() { 31 // TODO: implement run 32 print('小猫在跑'); 33 } 34 35} 36 37main(){ 38 39 Dog d=new Dog(); 40 d.eat(); 41 d.printInfo(); 42 43 Cat c=new Cat(); 44 c.eat(); 45 c.printInfo(); 46 47 48 // Animal a=new Animal(); //抽象类没法直接被实例化 49 50} 51

二、Datr中的多态

  1. 允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。

  2. 子类的实例赋值给父类的引用。

  3. 多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。

1abstract class Animal{ 2 eat(); //抽象方法 3} 4 5class Dog extends Animal{ 6 @override 7 eat() { 8 print('小狗在吃骨头'); 9 } 10 run(){ 11 print('run'); 12 } 13} 14class Cat extends Animal{ 15 @override 16 eat() { 17 print('小猫在吃老鼠'); 18 } 19 run(){ 20 print('run'); 21 } 22} 23 24main(){ 25 26 // Dog d=new Dog(); 27 // d.eat(); 28 // d.run(); 29 30 31 // Cat c=new Cat(); 32 // c.eat(); 33 34 35 Animal d=new Dog(); //子类的一个实例赋值给父类的引用,只能由父类中的方法 36 37 d.eat(); 38 39 40 41 Animal c=new Cat(); 42 43 c.eat(); 44 45 46} 47

三、Datr中的接口

  和Java一样,dart也有接口,但是和Java还是有区别的。

  首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。

  同样使用implements关键字进行实现。

  但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。

  而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。

  建议使用抽象类定义接口。

例子:定义一个DB库 支持 mysql  mssql  mongodb

          mysql  mssql  mongodb三个类里面都有同样的方法

1abstract class Db{ //当做接口 接口:就是约定 、规范 2 String uri; //数据库的链接地址 3 add(String data); 4 save(); 5 delete(); 6} 7 8class Mysql implements Db{ 9 10 @override 11 String uri; 12 13 Mysql(this.uri); 14 15 @override 16 add(data) { 17 // TODO: implement add 18 print('这是mysql的add方法'+data); 19 } 20 21 @override 22 delete() { 23 // TODO: implement delete 24 return null; 25 } 26 27 @override 28 save() { 29 // TODO: implement save 30 return null; 31 } 32 33 remove(){ 34 35 } 36 37} 38 39class MsSql implements Db{ 40 @override 41 String uri; 42 43 @override 44 add(String data) { 45 print('这是mssql的add方法'+data); 46 } 47 48 @override 49 delete() { 50 // TODO: implement delete 51 return null; 52 } 53 54 @override 55 save() { 56 // TODO: implement save 57 return null; 58 } 59 60} 61 62main() { 63 64 Mysql mysql=new Mysql('xxxxxx'); 65 66 mysql.add('1243214'); 67 68} 69
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

【Flutter实战】图片和Icon

3.5图片及ICON3.5.1图片Flutter中,我们可以通过Image组件来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。ImageProviderImageProvider是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvi