简介

虽然dart中的类只能有一个父类,也就是单继承的,但是dart提供了mixin语法来绕过这样限制。

今天,和大家一起来探讨一下dart类中的继承。

使用extends

和JAVA一样,dart中可以定义一个父类,然后使用extends来继承他,得到一个子类,如下所示:

class Student{

}
class Boy extends Student{ }

在子类中,可以使用super关键词来调用父类的方法。

抽象类和接口

dart中除了继承普通类之外,还可以继承抽象类和实现接口。

抽象类是以abstract关键词修饰的class,如下所示:

abstract class Student{
String getName();
}

抽象类中通常会有抽象方法,抽象方法需要在子类中进行实现。

当然抽象类中也可以有具体实现的方法,但是抽象类不可以被实例化,如果你想在抽象类中实例化对象,这可以使用之前我们提到的工厂构造函数。

和java不同的是,dart中并没有interface,他引入的是一个Implicit interfaces的概念。

对应每个对象来说,都隐式定义了一个包含类中所有方法和属性的接口。

一般来说,如果一个对象包含另外一个对象的结构和方法,但是他们之间的内容又是不一样的,则可以使用implements来隐式实现接口,如下所示:

class Student{

  String name;
String get _name => name;
} class Girl implements Student{
@override
String name; @override
String get _name => "girls";
}

在dart中一个类可以implements多个接口。

上面的例子中,我们用到了@override注解,他表示子类对父类方法或者属性的重写。

在使用@override中,我们需要注意的是,子类对父类的实现会有下面几个限制:

  1. 子类的实现方法的返回值,必须和父类返回值相同,或者是父类返回值的子类。
  2. 子类的实现方法的参数,必须和父类方法参数相同,或者是父类参数的父类。
  3. 子类方法的参数必须和父类的参数个数相同。

mixins

虽然dart不支持多重继承,但是可以使用mixin来实现类似多重继承的功能。

要使用mixins,可以使用关键字with,如下所示:

class Boy extends Student with Person {
// ···
name='boy';
myName();
}

在dart中mixin是一个特殊的类,使用关键词mixin来描述,mixin的类中,没有构造函数,如下所示:

mixin Person {
String name=''; void myName() {
print('my name is:'+name);
}
}

在mixin中可以定义有用的方法和属性,继承mixin的类可以重写对应的属性和方法,从而达到自定义的功能。

在mixin中我们也可以指定特定的类,也就是说只有特定的类才能够使用mixin,则可以使用关键词on,如下所示:

mixin Person on Boy{
String name=''; void myName() {
print('my name is:'+name);
}
}

总结

以上就是dart中继承的使用,dart中还可以继承方法,这是dart的高级应用,我们会在后续的文章中进行介绍,敬请期待。

本文已收录于 http://www.flydean.com/07-dart-extend/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

dart系列之:dart类的扩展的更多相关文章

  1. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...

  2. dart系列之:dart类中的构造函数

    目录 简介 传统的构造函数 命名构造函数 构造函数的执行顺序 重定向构造函数 Constant构造函数 工厂构造函数 总结 简介 dart作为一种面向对象的语言,class是必不可少的.dart中所有 ...

  3. dart系列之:dart代码最佳实践

    目录 简介 命名规则 import中的顺序 格式化 总结 简介 每种语言都有自己的代码风格,这种代码风格是跟语言特性息息相关的.如果在编码的过程中遵循这种统一的编码规则,会给我们的业务带来非常多的便利 ...

  4. dart系列之:dart类中的泛型

    目录 简介 为什么要用泛型 怎么使用泛型 类型擦除 泛型的继承 泛型方法 总结 简介 熟悉JAVA的朋友可能知道,JAVA在8中引入了泛型的概念.什么是泛型呢?泛型就是一种通用的类型格式,一般用在集合 ...

  5. dart系列之:dart语言中的变量

    目录 简介 dart中的变量 定义变量 变量的默认值 Late变量 常量 总结 简介 flutter是google在2015年dart开发者峰会上推出的一种开源的移动UI构建框架,使用flutter可 ...

  6. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

  7. dart系列之:dart语言中的异常

    目录 简介 Exception和Error Throw和catch Finally 总结 简介 Exception是程序中的异常情况,在JAVA中exception有checked Exception ...

  8. dart系列之:dart优秀的秘诀-隔离机制

    目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异步编 ...

  9. dart系列之:dart语言中的函数

    目录 简介 函数的参数 main函数 匿名函数 闭包 函数的返回值 总结 简介 函数是所有编程语言都有的内容,不管是面向对象还是面向过程,函数都是非常重要的一部分.dart中的函数和java中的函数有 ...

随机推荐

  1. cybersploit

    靶机准备 将ova文件导入虚拟机中,设置网络模式为NAT 从靶机描述得知包含3个flag kali扫描其ip netdiscover -r 192.168.164.0/24 渗透测试 namp扫描端口 ...

  2. Jetpack Compose学习(6)——关于Modifier的妙用

    原文: Jetpack Compose学习(6)--关于Modifier的妙用 | Stars-One的杂货小窝 之前学习记录中也是陆陆续续地将常用的Modifier的方法穿插进去了,本期就来详细的讲 ...

  3. DIVIDEMIX: LEARNING WITH NOISY LABELS AS SEMI-SUPERVISED LEARNING

    论文阅读: DIVIDEMIX: LEARNING WITH NOISY LABELS AS SEMI-SUPERVISED LEARNING 作者说明 版权声明:本文为博主原创文章,遵循CC 4.0 ...

  4. Serverless 在编程教育中的实践

    说起Serverless这个词,我想大家应该都不陌生,那么Serverless这个词到底是什么意思?Serverless到底能解决什么问题?可能很多朋友还没有深刻的体会和体感,这篇文章我就和大家一起聊 ...

  5. 实现前后端分离,最好的方案就是SPA(Single Page Application)

    从通常意义来讲,说到必须,就是指最佳实践上,实现前后端分离,最好的方案就是SPA.所以才会有 前后端分离=SPA 的近似,忽视了其中的差别.但是,既然有疑问了,我们就来看一下,为什么SPA是实现前后端 ...

  6. 实用 | 利用 aardio 配合 Python 快速开发桌面应用

    1. 前言 大家好,我是安果! 我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长 假如想快速开发一款 PC ...

  7. 初学python-day5 流程控制

    流程控制 一.判断语句 1.if语句(单一条件分支) 结构: if    表达式: 为真的时候执行的语句 概述:当程序运行到if语句时候,首页要计算表达式的值,判断真假,如果表达式的职位为真,则执行i ...

  8. LeetCode:动态规划

    动态规划 动态规划永远的神 这部分主要是学习了 labuladong 公众号中对于动态规划的讲解 刷了些 leetcode 题,在此做一些记录,不然没几天就忘光光了 题目 这部分内容直接上题目了,解题 ...

  9. [敏捷软工团队博客]Beta阶段事后分析

    设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件要解决的问题是:现在的软工课程的作业分布在博客园.GitHub上,没有一个集成多种功能的一体化 ...

  10. 零基础要怎么样学习嵌入式Linux--走进嵌入式

    零基础要怎么样学习嵌入式希望可以通过这一篇帖子让大家走进嵌入式,对嵌入式的学习不再那么陌生. 嵌入式Linux工程师的学习需要具备一定的C语言基础,因此面对许多朋友只是在大一或者大二学习过C(还不一定 ...