一、概述

  • 继承(关键字 extends)
  • 混入  mixins (关键字 with)
  • 接口实现(关键字 implements)

这三种关系可以同时存在,但是有前后顺序:

  1. extends -> mixins -> implements

extens在前,mixins在中间,implements最后;

二、实战

2.1 继承(extends)

dart中的继承规则:

    • 子类使用extends关键词来继承父类
    • 子类会继承父类里面可见的属性和方法 但是不会继承构造函数
    • 子类能复写父类的方法 getter和setter
    • 子类重写超类的方法,要用@override
    • 子类调用超类的方法,要用super
    • 子类可以继承父类的非私有变量

栗子举起来:

  1. class Person {
  2. //公有变量
  3. String name;
  4. num age;
  5. //私有变量
  6. String _gender;
  7. //类名构造函数
  8. Person(this.name,this.age);
  9. //公有的方法
  10. void printInfo() {
  11. print("${this.name}---${this.age}");
  12. }
  13.  
  14. work(){
  15. print("${this.name}在工作...");
  16. }
  17. }
  18.  
  19. class Web extends Person{
  20.  Web(String name, num age) : super(name, age);
  21. run(){
  22. print('run');
  23. super.work(); //自类调用父类的方法
  24. }
  25.  
  26. //覆写父类的方法
  27. @override //可以写也可以不写 建议在覆写父类方法的时候加上 @override
  28. void printInfo(){
  29. print("姓名:${this.name}---年龄:${this.age}");
  30. }
  31. }
  32.  
  33. main(){
  34. Web w =n ew Web('李四',);
  35. // w.printInfo();
  36. w.run();
  37. }

2.2 混合 mixins (with)

  mixins的中文意思是混入,就是在类中混入其他功能。在Dart中可以使用mixins实现类似多继承的功能因为mixins使用的条件,随着Dart版本一直在变,这里说的是Dart2.x中使用mixins的条件:
  • (1) 作为mixins的类只能继承自Object,不能继承其他类
  • (2) 作为mixins的类不能有构造函数
  • (3) 一个类可以mixins多个mixins
  • (4) mixins绝不是继承,也不是接口,而是一种全新的特性
  • 看具体代码:
  1. class Person{
  2. String name;
  3. num age;
  4. Person(this.name,this.age);
  5. printInfo(){
  6. print('${this.name}----${this.age}');
  7. }
  8. void run(){
  9. print("Person Run");
  10. }
  11. }
  12.  
  13. class A {
  14. String info="this is A";
  15. void printA(){
  16. print("A");
  17. }
  18. void run(){
  19. print("A Run");
  20. }
  21. }
  22.  
  23. class B {
  24. void printB(){
  25. print("B");
  26. }
  27. void run(){
  28. print("B Run");
  29. }
  30. }
  31.  
  32. class C extends Person with B,A{
  33. C(String name, num age) : super(name, age);
  34. }
  35.  
  36. void main(){
  37. var c = new C('张三',);
  38. c.printInfo();
  39. // c.printB();
  40. // print(c.info);
  41. c.run();
  42. }

2.3 接口实现(implements)

  Flutter是没有interface的,但是Flutter中的每个类都是一个隐式的接口,这个接口包含类里的所有成员变量,以及定义的方法。如果有一个类 A,你想让类B拥有A的API,但又不想拥有A里的实现,那么你就应该把A当做接口,类B implements 类A.
  所以在Flutter中:class 就是 interface

    • 当class被当做interface用时,class中的方法就是接口的方法,需要在子类里重新实现,在子类实现的时候要加@override
    • 当class被当做interface用时,class中的成员变量也需要在子类里重新实现。在成员变量前加@override
  1. /*
  2. Dart中一个类实现多个接口:
  3. */
  4.  
  5. abstract class A{
  6. String name;
  7. printA();
  8. }
  9.  
  10. abstract class B{
  11. printB();
  12. }
  13.  
  14. class C implements A,B{
  15. @override
  16. String name;
  17. @override
  18. printA() {
  19. print('printA');
  20. }
  21. @override
  22. printB() {
  23. // TODO: implement printB
  24. return null;
  25. }
  26. }
  27.  
  28. void main(){
  29. C c=new C();
  30. c.printA();
  31. }

dart中extends、 implements、with的用法与区别的更多相关文章

  1. 【Dart学习】-- Dart之extends && implements && with的用法与区别

    一,概述 继承(关键字 extends) 混入  mixins (关键字 with) 接口实现(关键字 implements) 这三种关系可以同时存在,但是有前后顺序: extends -> m ...

  2. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

  3. 分组函数group by和Oracle中分析函数partition by的用法以及区别

    1.分组函数group by和Oracle中分析函数partition by的用法以及区别 2.开窗函数.

  4. Nginx中root与alias的用法及区别:

    Nginx中root与alias都是定义location {}块中虚拟目录访问的文件位置: 先看看两者在用法上的区别: location /img/ { alias /var/www/image/; ...

  5. 【转】STL中mem_fun和mem_fun_ref的用法及区别

    原文:http://www.cppblog.com/mysileng/archive/2012/12/25/196615.html 引子: 怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是 ...

  6. js中innerHTML与innerText的用法与区别

    用法: <div id="test">    <span style="color:red">test1</span> te ...

  7. C中的malloc/free与C++中的new/delete的用法与区别

    1.先介绍malloc/free的用法: 原型函数: void *malloc(long NumBytes); 该函数分配了NumBytes个字节的内容,分配的空间是堆空间 malloc()根据用户所 ...

  8. php中get_cfg_var()和ini_get()的用法及区别

    php里get_cfg_var()和ini_get()都是取得配置值的函数,当你需要获取php.ini里的某个选项的配置值时,这两个函数都都可以使用,得到的结果是一样的. 不过,get_cfg_var ...

  9. java中this和super的用法及区别

    this 用法1:代表当前对象本身 用法2:方法形参和类成员变量重名,用this进行区别 class demo{ private int age = 10; public int getAge(int ...

随机推荐

  1. Java 整型数组只有一个整数是只出现一次的,其余都出现两次

    package writtenExamination; /** * @author lindaZ * @date 2015年10月22日 * @todo 找出数组中仅出现一次的数,其余数字出现两次 * ...

  2. docker学习---搭建Docker LAMP环境

    1.环境 系统版本:CentOS Linux release 7.4.1708 docker版本:docker-ce-18.09 主机IP:192.168.121.121 2.载入MySQL和PHP镜 ...

  3. 笔记37 Spring Web Flow——流程的组件

    在Spring Web Flow中,流程是由三个主要元素定义的:状态.转移和 流程数据. 一.状态 Spring Web Flow定义了五种不同类型的状态.通过选择Spring Web Flow的状态 ...

  4. day01 python起源 介绍 解释器 变量 流程控制if

    day01 python   一.python的起源     1.python简介     java 企业级应用, android, app     c 操作系统, 做开发语言的, 游戏的内核     ...

  5. python中while与else的联姻

    循环使用 else 语句在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断 ...

  6. shell脚本中关于日期的操作

    一.计算指定日期的前一天的日期 date -d "yesterday 20150401 " +%Y%m%d 二.如果获取当前日期的前一天        date -d " ...

  7. dubbo入门之服务消费

    今天,我们来看看dubbo消费的执行过程 首先,我们都知道dubbo是一个基于netty实现的RPC框架,底层通信是使用netty来实现的.在学习dubbo的时候,或许我们都会有下面的这些疑惑: 1. ...

  8. 关于mybaitis

    mybatis启动流程 1.首先来看看最简单的mybatis项目启动过程 public static void mybatisTest() throws IOException { String re ...

  9. Spring boot热部署实战

    1.介绍 在开发工程中,修改一点儿代码,想看效果就需要重新启动服务,这样会花费大量时间在重启服务上,通过devtools热部署可以大大减少重启服务的时间. 之所以能减少时间,是因为Spring Boo ...

  10. leetcood学习笔记-437-路径总和③**

    题目描述: 方法一:栈 class Solution(object): def pathSum(self, root, sum): """ :type root: Tre ...