dart快速入门教程 (7.4)
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)的更多相关文章
- dart快速入门教程 (8)
9.dart中的库 9.1.自定义库 自定义库我们在前面已经使用过了,把某些功能抽取到一个文件,使用的时候通过import引入即可 9.2.系统内置库 以math库为例: import "d ...
- dart快速入门教程 (7.3)
7.4.抽离类为单独文件 新建一个文件,单独存放一个类,例如:Person类抽离到person.dart文件中 class Person { final String name; final num ...
- dart快速入门教程 (7.2)
7.4.抽离类为单独文件 新建一个文件,单独存放一个类,例如:Person类抽离到person.dart文件中 class Person { final String name; final num ...
- dart快速入门教程 (7.1)
7.面向对象 dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,所有的类都是Object的子类,换句话说就是万物皆对象 7.1.类与对象 void main() { // 注意:ne ...
- dart快速入门教程 (2)
2.变量和数据类型 2.1.变量和常量 变量通俗的说就是可以变化的量,作用就是用来存储数据,你可以把一个变量看作是一个水果篮,里面可以装苹果.梨.香蕉等,常量就是一个固定的值,和变量是相对的,变量可以 ...
- dart快速入门教程 (1)
1.环境搭建 1.1.dart简介 Dart 是一种 易于学习. 易于扩展.并且可以部署到 任何地方 的 应用 编程 语言.Google 使用 Dart 来开发 大型应用.flutter使用dart语 ...
- dart快速入门教程 (6)
6.内置操作方法和属性 6.1.数字类型 1.isEven判断是否是偶数 int n = 10; print(n.isEven); // true 2.isOdd判断是否是奇数 int n = 101 ...
- dart快速入门教程 (5)
5.函数 5.1.函数定义 语法: 返回值类型 函数名(参数类型 参数1, 参数类型 参数2,...) { // 函数体 return '返回值' } 举例: void main() { print( ...
- dart快速入门教程 (4)
4.流程控制 4.1.分支结构 1.if语句 void main() { int score = 80; if (score >= 90) { print('优秀'); } else if (s ...
随机推荐
- Java实现 LeetCode 1两数之和
1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...
- Java实现 LeetCode 290 单词规律
290. 单词规律 给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非 ...
- Java实现 蓝桥杯 数独游戏
你一定听说过"数独"游戏. 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个同色九宫内的数字均含1-9,不重复. 数独的答案都是唯一 ...
- java实现放麦子问题
/* 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服, 问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子, 在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子, 在第 ...
- Babel 7 安装与配置
Babel:帮我们把高级的语法(ES6)转为低级的语法 /* Babel 7.x版本 安装如下 (cnpm i @babel/cli -D) //Bab ...
- MySQL索引实践
数据库索引本质上是一种数据结构(存储结构+算法),目的是为了加快数据检索速度. 1.索引的类型(待完善) 主键索引:给表设置主键,这个表就拥有主键索引. 唯一索引:unique 普通索引:增加某个字段 ...
- 括号匹配-算法详细题解LeetCode
题目:有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. ...
- Java实现圆柱体表面积和体积的计算
题目描述: Java编程实现圆柱体表面积和体积的计算,要求从键盘上输入圆的半径和高,然后输出结果. 题目分析: 首先定义Circle类,然后在main方法中创建Circle类的对象c,利用对象c访问其 ...
- Kubernetes日志的6个最佳实践
本文转自Rancher Labs Kubernetes可以帮助管理部署在Pod中的上百个容器的生命周期.它是高度分布式的并且各个部分是动态的.一个已经实现的Kubernetes环境通常涉及带有集群和节 ...
- 提高网站访问性能之Tomcat优化
一.前言 tomcat 服务器在JavaEE项目中使用率非常高,所以在生产环境对tomcat的优化也变得非常重要了,对于tomcat的优化,主要是从2个方面入手,一是tomcat本身的配置,另一个是t ...