在上一篇博客,笔者介绍了Dart类的构造方法

带你Dart带你Diao之类(一)

这一篇博客是介绍Dart类的其他内容,主要包括:

  • Getters和Setters 方法
  • 抽象类和抽象方法
  • 隐式接口
  • 继承
  • 枚举
  • mixin

Getters和Setters方法

这里和java不一样的是,我们只需要使用get和set关键字来实现getter和setter方法可以来读写其他属性

class Rectangle {num left, top, width, height;Rectangle(this.left, this.top, this.width, this.height);//get关键字实现getter方法num get right=>left+width;//set关键字实现setter关键字set right(num value) => top-value;
}

调用setter和getter方法

void learnSetAndGetFunction(){var rect = Rectangle(3, 4, 20, 15);rect.right=20;  //setterprint(rect.right);  //getter
}

抽象类和抽象方法

使用abstract修饰符定义不能实例化的抽象类。抽象类对于定义接口非常有用。如果您希望抽象类看起来是可实例化的,请定义一个工厂构造函数。

抽象类通常有抽象方法

//这个类是抽象类,所以不能被实例化
abstract class AbstractContainer {// Define constructors, fields, methods...void updateChildren(); // Abstract method.
}

隐式接口

每个类都隐式地定义一个接口,该接口包含类的所有实例成员及其实现的任何接口。如果您想创建一个类A,它支持类B的API而不继承B的实现,那么类A应该实现B接口。

它的接口写法没有像java一样用interface关键字,依然用的是class


class Interface {final _name;// Not in the interface, since this is a constructor.Interface(this._name);// In the interface.String greet(String who) => 'Hello, $who. I am $_name.';
}

使用implements关键字实现接口,当然可以实现多个接口

class ImplementInterface implements Interface{@override// 必须实现  _name 的getter方法 get _name => '';// 必须实现 greet方法 @overrideString greet(String who) =>'Hello, $who. I am $_name.';}

测试一下接口和实现类

void testInterface(){Interface a=Interface('jasonking');ImplementInterface b=ImplementInterface();print(a.greet('tom')); //Hello, tom. I am jasonking.print(b.greet('tom'));//Hello, tom. I am .
}

继承

使用extend创建子类,使用super引用超类

class Television {void turnOn() {_illuminateDisplay();}// ···
}class SmartTelevision extends Television {void turnOn() {super.turnOn();}// ···
}

继承完之后,我们可以重写类的成员,这里和java基本都是一样的,包括实例方法、getter和setter。

还可以重写操作符
比如下面的例子重写了+和-这两个操作符

class Vector {final int x, y;Vector(this.x, this.y);Vector operator +(Vector v) => Vector(x + v.x, y + v.y);Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
}

枚举

使用enum关键字声明一个枚举类型

enum Color { red, green, blue }

枚举中的每个值都有一个索引getter,它返回enum声明中值的从0开始的位置。例如,第一个值有索引0,第二个值有索引1

比如上面的枚举Color.red.index的值就是0

获取枚举中所有值的列表

List<Color> colors = Color.values;
assert(colors[2] == Color.blue);

在switch语句中使用enum,如果switch的case不处理enum的所有值,将会报一个警告消息

var aColor = Color.blue;switch (aColor) {case Color.red:print('Red as roses!');break;case Color.green:print('Green as grass!');break;default: // Without this, you see a WARNING.print(aColor); // 'Color.blue'
}

注意:枚举不能显式实例化

mixin

mixin是在多个类层次结构中重用类代码的一种方式

通俗点说就是多继承,因为extend后面只能继承一个类。但是为了要重用多个类的代码,我们就要使用mixin。用法很简单,只需要在with关键字后面加上一个或多个mixin名称就好了

abstract class Musical {bool canPlayPiano = false;bool canCompose = false;bool canConduct = false;void entertainMe() {if (canPlayPiano) {print('Playing piano');} else if (canConduct) {print('Waving hands');} else {print('Humming to self');}}
}class Musician extends Vector with Musical {Musician(int x, int y) : super(x, y);// ···}

通过子类的对象调用父类的方法,发现是可以的

Musical musical=new Musician(0, 0);
musical.entertainMe();  //结果是 Humming to self

到这里我们关于Dart类的语法知识就介绍完了。这算是一个小的里程碑。后面的博客会继续介绍Dart的更高阶一点的语法内容哦~~想看看之前系列的往下瞅

Dart相关系列的传送门

  • 带你Dart带你Diao之重要概念
  • 带你Dart带你Diao之Functions
  • 带你Dart带你Diao之操作符
  • 带你Dart带你Diao之流程控制语句和异常
  • 带你Dart带你Diao之类(一)

带你Dart带你Diao之类(二)相关推荐

  1. 零基础带你学习MySQL—unique 唯一(二十五)

    零基础带你学习MySQL-unique 唯一(二十五) unqiue 使用细节 如果没有指定 not null 则 unique 字段可以有多个 null 如果一个列(字段) 是 unique not ...

  2. 零基础带你学习MySQL—查询数据库(二)

    零基础带你学习MySQL-查询数据库(二) 如果数据库名字不是关键字,习惯性的不加反引号 哎呀 我就是懒,如果是关键字,必须要加上反引号 什么是关键字 我想大家应该都知道 我就不写了 哎呀 我就是懒

  3. 阿俊带你用Kotlin刷算法(二)

    本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...

  4. mysql为什么用b加树_为什么MySQL要用B+树?聊聊B+树与硬盘的前世今生【宇哥带你玩转MySQL 索引篇(二)】...

    为什么MySQL要用B+树?聊聊B+树与硬盘的前世今生 在上一节,我们聊到数据库为了让我们的查询加速,通过索引方式对数据进行冗余并排序,这样我们在使用时就可以在排好序的数据里进行快速的二分查找,使得查 ...

  5. 解释三度带和六度带的概念以及各坐标系如何定义

    ★ 地形图坐标系:我国的地形图采用高斯-克吕格平面直角坐标系.在该坐标系中,横轴:赤道,用Y表示:纵轴:中央经线,用X表示:坐标原点:中央经线与赤道的交点,用O表示.赤道以南为负,以北为正:中央经线以 ...

  6. Python带*参数和带**参数

    一.带*形参 1.格式:*形参名,如*args 2.数据类型:元组 3.传参方式:接收任意个位置参数(可以不传参). 4.位置:在一个函数里只能有一个,且放在末尾(没有带**形参的情况下). 二.带* ...

  7. console线驱动安装_低压灯带和高压灯带区别是啥 安装方法是啥?

    灯带是很多朋友都知道的,而且一般都是在客厅比较常见,灯带分为低压和高压两个,这两者也是有一定区别的,很多人也在纠结购买哪种灯带比较好,下面就跟装一网一起来看看低压灯带和高压灯带区别以及安装方法,希望大 ...

  8. Python带*参数和带**参数:可变参数

    一.理论解释: *参数与**参数是Python参数中的重点知识,他们都被称为可变参数(任意参数),我们经常会在代码中看到*args.**kwargs 作为函数定义时:收集未匹配参数组成tuple或di ...

  9. Python实现猜词游戏 Hangman Game(不带提示和带提示版本)

    本文目录 Python实现猜词游戏(Hangman Game) 一.任务准备 二.Hangman游戏的功能需求 三.辅助函数的构建 1.确定一个单词是否被猜出 2.获取用户当前的猜词进度 3.确定还有 ...

  10. HTML5期末大作业:个人网站设计——彭于晏明星(15页)带特效 带登录 带轮播 带音乐 HTML+CSS+JavaScript 大学生毕设网页设计源码HTML (1)

    HTML5期末大作业:个人网站设计--彭于晏明星(15页)带特效带登录带轮播带音乐 HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 ...

最新文章

  1. 比较数据库表结构之间的差异
  2. Apache配置文件的帮助查询
  3. 冒泡排序c++代码_八大排序算法(解释+代码+结果+算法优化)
  4. MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识
  5. MySQL学习笔记1(增删查改)
  6. 人工智能和机器学习的前世今生
  7. redis 计数器 java_Redis 的 8 大应用场景!
  8. react-TodoList案例
  9. 华为荣耀鸿蒙系统升级名单,华为鸿蒙系统正式版首批升级名单公布:这8款机型用户有福了...
  10. C++小白课本练习2
  11. 解决ASP.NET MVC(post数据)Json请求太大,无法反序列化,而报【远程服务器返回错误: (500) 内部服务器错误】...
  12. 两个工作流:什么时候选择BizTalk,什么时候选择WWF?微软人士给了一个简单的判断原则...
  13. ts80x服务器系统,Lenovo ThinkServer TS80X 塔式服务器
  14. Java 发送短信工具类
  15. 技术篇(二)Demo示例——Bundle打包和加载
  16. 第四周项目2--建立”单链表“算法库
  17. 2018 Unite大会——《使用UPA工具优化项目》演讲实录
  18. “0基础考生考前三小时突破《申论》80分气哭学霸”——公文题(公文基础理论+方案类+总结类)
  19. 失去池子的笑果文化越来越不好笑了
  20. animation和transition的区别及使用

热门文章

  1. 运维工作5年简历写成这样,谁敢要你
  2. 115网盘摇奖的位置变了~
  3. 《浏览器播放RTSP方案》之 VLC插件播放RTSP视频流
  4. APP开通支付宝支付 转账功能
  5. 计算机研究生申请 MIT,麻省理工计算机专业研究生申请条件有什么?
  6. 如何0成本搭建外卖CPS返利小程序
  7. 短信验证功能、邮箱验证功能
  8. tan和cot的梗_“sin对cos说 我们今晚是tan呢?还是cot呢?”啥意思
  9. 公司网络很慢很卡的原因分析与处理
  10. 一文告诉您游戏开发需要学什么