带你Dart带你Diao之类(二)
在上一篇博客,笔者介绍了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之类(二)相关推荐
- 零基础带你学习MySQL—unique 唯一(二十五)
零基础带你学习MySQL-unique 唯一(二十五) unqiue 使用细节 如果没有指定 not null 则 unique 字段可以有多个 null 如果一个列(字段) 是 unique not ...
- 零基础带你学习MySQL—查询数据库(二)
零基础带你学习MySQL-查询数据库(二) 如果数据库名字不是关键字,习惯性的不加反引号 哎呀 我就是懒,如果是关键字,必须要加上反引号 什么是关键字 我想大家应该都知道 我就不写了 哎呀 我就是懒
- 阿俊带你用Kotlin刷算法(二)
本系列通过Java和Kotlin这两种语言来解决力扣上面的算法题,由于本人算法菜鸟一枚,可能部分题目并不是最优题解,希望能和各位大神共同讨论~ 阿俊带你用Kotlin刷算法(一) 阿俊带你用Kotli ...
- mysql为什么用b加树_为什么MySQL要用B+树?聊聊B+树与硬盘的前世今生【宇哥带你玩转MySQL 索引篇(二)】...
为什么MySQL要用B+树?聊聊B+树与硬盘的前世今生 在上一节,我们聊到数据库为了让我们的查询加速,通过索引方式对数据进行冗余并排序,这样我们在使用时就可以在排好序的数据里进行快速的二分查找,使得查 ...
- 解释三度带和六度带的概念以及各坐标系如何定义
★ 地形图坐标系:我国的地形图采用高斯-克吕格平面直角坐标系.在该坐标系中,横轴:赤道,用Y表示:纵轴:中央经线,用X表示:坐标原点:中央经线与赤道的交点,用O表示.赤道以南为负,以北为正:中央经线以 ...
- Python带*参数和带**参数
一.带*形参 1.格式:*形参名,如*args 2.数据类型:元组 3.传参方式:接收任意个位置参数(可以不传参). 4.位置:在一个函数里只能有一个,且放在末尾(没有带**形参的情况下). 二.带* ...
- console线驱动安装_低压灯带和高压灯带区别是啥 安装方法是啥?
灯带是很多朋友都知道的,而且一般都是在客厅比较常见,灯带分为低压和高压两个,这两者也是有一定区别的,很多人也在纠结购买哪种灯带比较好,下面就跟装一网一起来看看低压灯带和高压灯带区别以及安装方法,希望大 ...
- Python带*参数和带**参数:可变参数
一.理论解释: *参数与**参数是Python参数中的重点知识,他们都被称为可变参数(任意参数),我们经常会在代码中看到*args.**kwargs 作为函数定义时:收集未匹配参数组成tuple或di ...
- Python实现猜词游戏 Hangman Game(不带提示和带提示版本)
本文目录 Python实现猜词游戏(Hangman Game) 一.任务准备 二.Hangman游戏的功能需求 三.辅助函数的构建 1.确定一个单词是否被猜出 2.获取用户当前的猜词进度 3.确定还有 ...
- HTML5期末大作业:个人网站设计——彭于晏明星(15页)带特效 带登录 带轮播 带音乐 HTML+CSS+JavaScript 大学生毕设网页设计源码HTML (1)
HTML5期末大作业:个人网站设计--彭于晏明星(15页)带特效带登录带轮播带音乐 HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 ...
最新文章
- 比较数据库表结构之间的差异
- Apache配置文件的帮助查询
- 冒泡排序c++代码_八大排序算法(解释+代码+结果+算法优化)
- MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识
- MySQL学习笔记1(增删查改)
- 人工智能和机器学习的前世今生
- redis 计数器 java_Redis 的 8 大应用场景!
- react-TodoList案例
- 华为荣耀鸿蒙系统升级名单,华为鸿蒙系统正式版首批升级名单公布:这8款机型用户有福了...
- C++小白课本练习2
- 解决ASP.NET MVC(post数据)Json请求太大,无法反序列化,而报【远程服务器返回错误: (500) 内部服务器错误】...
- 两个工作流:什么时候选择BizTalk,什么时候选择WWF?微软人士给了一个简单的判断原则...
- ts80x服务器系统,Lenovo ThinkServer TS80X 塔式服务器
- Java 发送短信工具类
- 技术篇(二)Demo示例——Bundle打包和加载
- 第四周项目2--建立”单链表“算法库
- 2018 Unite大会——《使用UPA工具优化项目》演讲实录
- “0基础考生考前三小时突破《申论》80分气哭学霸”——公文题(公文基础理论+方案类+总结类)
- 失去池子的笑果文化越来越不好笑了
- animation和transition的区别及使用