7.12.多态

多态字面上理解就是多种状态,通俗的说,多态表现为父类定义一个方法不去实现,子类继承这个方法后实现父类的方法,这个方法有多种表现

// import 'person.dart';

void main() {
var d = Dog();
d.run();
} abstract class Animal {
run();
} class Dog extends Animal {
@override
run() {
// 表现1
print("小狗在跑");
}
} class Cat extends Animal {
@override
run() {
// 表现2
print("小猫在跑");
}
}

7.13.接口

接口用于定义规范,和抽象类是类似的,接口里面定义的方法必须被实现,接口中的方法只能为抽象方法 新建lib文件夹,里面建DB.dart、Mysql.dart、MongoDB.dart文件

DB.dart 定义接口

abstract class DB {
find();
save();
update();
delete();
}

Mysql.dart实现接口

import 'DB.dart';

class Mysql implements DB {
Mysql(_uri) {
print("根据${_uri}链接数据库");
}
@override
save() {
print("增加数据");
} @override
find() {
print("查询数据");
} @override
update() {
print('更新数据');
} @override
delete() {
print("删除数据");
} @override
String get uri => null;
}

MongoDB.dart 实现接口

import 'DB.dart';

class MongoDB implements DB {
MongoDB(_uri) {
print("根据${_uri}链接数据库");
}
@override
save() {
print("增加数据");
} @override
find() {
print("查询数据");
} @override
update() {
print('更新数据');
} @override
delete() {
print("删除数据");
}
}

调用

import 'lib/Mysql.dart';

void main() {
var connection = new Mysql("http://127.0.0.1");
connection.save();
}

7.14.接口和抽象类的相同点和区别

它们的相同点是:1 都是上层的抽象 2 都不能被实例化 3 都包含抽象方法,但是不必具体实现

它们的不同点:从设计的角度讲,接口设计的目的是规范到底有哪些行为,是一种约束机制,规范不同的类必须具有某些相同的行为即可,即法律规定的就是必须遵守的,法律没有规定的没有人管你,而抽象类设计的目的是代码复用,当不同的类具有某些相同的行为,比如猫和狗都有吃东西、睡觉的行为,把这些相同行为都放到一个抽象类中,其中吃东西的行为两个类是一致的,睡觉的行为有差异,因此,吃东西的行为可以在抽象类中就可以先实现了,避免子类重复去实现这个行为,而睡觉这种行为两个类有差异,就让它们各自去实现

举例:

import 'dart:io';

void main() {
var c = new Cat();
c.eat("小猫");
c.sleep();
var d = new Dog();
d.eat("小狗");
d.sleep();
} abstract class Animal {
eat(name) {
print("${name}正在吃东西");
} sleep();
} class Dog extends Animal {
sleep() {
print("小狗晚上睡觉");
}
} class Cat extends Animal {
sleep() {
print("小猫晚上睡觉");
}
}

7.14.Mixins

在dart中继承是单继承方式,那如果要用到多继承呢?那就需要用到Mixins,Mixins类似于多继承,一个类可以继承多个类的属性和方法

void main() {
var d = new D();
d.printA();
d.printB();
d.printC();
} class A {
printA() {
print("这是A");
}
} class B {
printB() {
print("这是B");
}
} class C {
printC() {
print("这是C");
}
} class D extends A with B, C {}

注意:使用mixins的时候要注意继承顺序

void main() {
var d = new D();
d.printBC();
} class A {
printA() {
print("这是A");
}
} class B {
printB() {
print("这是B");
} printBC() {
print("这是B里面的BC");
}
} class C {
printC() {
print("这是C");
} printBC() {
print("这是C里面的BC");
}
}
// 把B,C位置换一下试试看结果
class D extends A with B, C {}

注意2: with关键字后面的类中不能显示的声明构造函数


class B {
// 这里有声明构造方法,后面就会报错
B() {}
printB() {
print("这是B");
} printBC() {
print("这是B里面的BC");
}
}

注意3: with后面的类(B、C)只能继承Object,不能继承别的类

// 继承别的类会报错
class B extends test{
B() {}
printB() {
print("这是B");
} printBC() {
print("这是B里面的BC");
}
}

简写

void main() {
var e = new E();
e.printA();
e.printB();
e.printC();
e.printBC();
} class A {
printA() {
print("这是A");
}
} class B {
printB() {
print("这是B");
} printBC() {
print("这是B里面的BC");
}
} class C {
printC() {
print("这是C");
} printBC() {
print("这是C里面的BC");
}
} // 混合组装A和B得到一个新的类D
class D = A with B;
// 混合组装D和C得到一个新的类E,E实际上就是A、B、C的混合
class E = D with C;

螺钉课堂视频课程地址:http://edu.nodeing.com

dart快速入门教程 (7.4)的更多相关文章

  1. dart快速入门教程 (8)

    9.dart中的库 9.1.自定义库 自定义库我们在前面已经使用过了,把某些功能抽取到一个文件,使用的时候通过import引入即可 9.2.系统内置库 以math库为例: import "d ...

  2. dart快速入门教程 (7.3)

    7.4.抽离类为单独文件 新建一个文件,单独存放一个类,例如:Person类抽离到person.dart文件中 class Person { final String name; final num ...

  3. dart快速入门教程 (7.2)

    7.4.抽离类为单独文件 新建一个文件,单独存放一个类,例如:Person类抽离到person.dart文件中 class Person { final String name; final num ...

  4. dart快速入门教程 (7.1)

    7.面向对象 dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,所有的类都是Object的子类,换句话说就是万物皆对象 7.1.类与对象 void main() { // 注意:ne ...

  5. dart快速入门教程 (2)

    2.变量和数据类型 2.1.变量和常量 变量通俗的说就是可以变化的量,作用就是用来存储数据,你可以把一个变量看作是一个水果篮,里面可以装苹果.梨.香蕉等,常量就是一个固定的值,和变量是相对的,变量可以 ...

  6. dart快速入门教程 (1)

    1.环境搭建 1.1.dart简介 Dart 是一种 易于学习. 易于扩展.并且可以部署到 任何地方 的 应用 编程 语言.Google 使用 Dart 来开发 大型应用.flutter使用dart语 ...

  7. dart快速入门教程 (6)

    6.内置操作方法和属性 6.1.数字类型 1.isEven判断是否是偶数 int n = 10; print(n.isEven); // true 2.isOdd判断是否是奇数 int n = 101 ...

  8. dart快速入门教程 (5)

    5.函数 5.1.函数定义 语法: 返回值类型 函数名(参数类型 参数1, 参数类型 参数2,...) { // 函数体 return '返回值' } 举例: void main() { print( ...

  9. dart快速入门教程 (4)

    4.流程控制 4.1.分支结构 1.if语句 void main() { int score = 80; if (score >= 90) { print('优秀'); } else if (s ...

随机推荐

  1. Rocket - util - MaskGen

    https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw   介绍MaskGen的实现.   ​​   1. 基本介绍   给定总线宽度beatBytes,根 ...

  2. Spring Boot笔记(三) springboot 集成 Quartz 定时任务

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1. 在 pom.xml 中 添加 Quartz 所需要 的 依赖 <!--定时器 quartz- ...

  3. DynamIQ扫盲文

    综述: ARM CPU的架构都基于big.LITTLE大小核技术.而再big.LITTLE的基础上,又添加了DynamIQ.单一Cluster中可以又8个core,且支持不同架构的core,以及支持不 ...

  4. java实现第三届蓝桥杯地址格式转换

    地址格式转换 [编程题](满分21分) Excel是最常用的办公软件.每个单元格都有唯一的地址表示.比如:第12行第4列表示为:"D12",第5行第255列表示为"IU5 ...

  5. PAT 有几个PAT

    字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...

  6. JS变量小总

    变量分类:1.栈内存(stack)和堆内存(heap)2.基本类型和引用类型 #栈内存(stack) 一般为静态分配内存,其分配的内存系统自动释放. #堆内存(heap) 一般为动态分配内存,其分配的 ...

  7. 4.keras-交叉熵的介绍和应用

    keras-交叉熵的介绍和应用 1.载入数据以及预处理 import numpy as np from keras.datasets import mnist from keras.utils imp ...

  8. RocketMQ系列(三)消息的生产与消费

    前面的章节,我们已经把RocketMQ的环境搭建起来了,是一个两主两从的异步集群.接下来,我们就看看怎么去使用RocketMQ,在使用之前,先要在NameServer中创建Topic,我们知道Rock ...

  9. Flask 的配置文件

    Flask 的配置文件 四种方法给 Flask 做配置 1直接给 app 对象赋值属性 以字典的形式,给flask做配置 以文件的形式,给flask做配置(django 就是用这种) 以类的形式,给f ...

  10. (二)Java编程基础

    目录 一.关键字与保留字 二.标识符与变量 三.基本数据类型的转换 四.运算符 五.分支语句 五.循环语句 六.跳转语句 七.Java从键盘读取输入 一.关键字与保留字 定义:①关键字:Java关键字 ...