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 - diplomacy - misaligned

    https://mp.weixin.qq.com/s/poCJBcx45clXHm6Uuv8M6w 介绍AddressSet.misaligned的实现.之前介绍的比较概括,也有偏差.这里根据实际执行 ...

  2. Java实现 LeetCode 832 翻转图像(位运算)

    832. 翻转图像 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...

  3. Java实现 LeetCode 764 最大加号标志(暴力递推)

    764. 最大加号标志 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1.网格中包含 1 的最大的轴对齐加号 ...

  4. Java实现 LeetCode 427 建立四叉树

    427. 建立四叉树 我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络.网络中每一格的值只会是真或假.树的根结点代表整个网络.对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相 ...

  5. Java实现约瑟夫环问题

    约瑟夫环问题起源于一个犹太故事.约瑟夫环问题的大意如下: 罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫.这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友.剩余的39个人 ...

  6. java实现迷宫走法

    ** 迷宫走法** 迷宫问题 对于走迷宫,人们提出过很多计算机上的解法.深度优先搜索.广度优先搜索是使用最广的方法.生活中,人们更愿意使用"紧贴墙壁,靠右行走"的简单规则. 下面的 ...

  7. TZOJ 复习时间

    描述 为了能过个好年,xhd开始复习了,于是每天晚上背着书往教室跑.为了追求更高的效率,xhd要根据难度值来选择合适的课程进行复习,复习后一门课的效率为前一门课之间的难度差的平方,而复习第一门课的效率 ...

  8. 震惊!当Python遇到Excel后,将开启你的认知虫洞

    本文主要内容:   1. Excel,你为什么如此强大 2. 软件开发也需要团队作战 3. Excel的集成方案演化 4. macOS特有的集成方案:applescript 5. Python与Exc ...

  9. 带你学够浪:Go语言基础系列 - 8分钟学控制流语句

    ★ 文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) " 对于一般的语言使用者来说 ,20% ...

  10. Vue3 新特性

    一.vue3 为什么要重写 两个主要原因考虑重写vue新版本主要功能: 1.主流浏览器对新的JavaScript语言特性的普遍支持. 2.当前Vue代码库随着时间的推移而暴露出来的设计和体系架构问题. ...