1.Dart中的变量与常量
1.1 变量
如果只是用var声明变量,声明该变量之后是可以修改数据类型的
var who;
who="what";
print(who is String);//true
who=10;
print(who is int);//true
如果声明的同时取赋值,那么该对象的类型就是固定的,不可修改
var who="what";
print(who is String);//true
who=10;//此处报错
print(who is int);//false
未赋值时,var声明的变量类型为dynamic(动态的)
2.1常量
如果一个变量你以后不打算修改,可以使用 final 或者 const进行修饰,当你试图修改它的值,就会报错。
一个 final 变量只能赋值一次:它的值可以在运行时获取
一个 const 变量是编译时常量:代码还没有运行时我们就知道它声明变量的值
如下,同样是当前时间,final修饰的f对象是正确的,但const修饰的是错误的,原因是final可以在运行时对变量初始化,但const不行。
final f = DateTime.now(); // OK
const c = DateTime.now(); // ERROR Const variables must be initialized with a constant value.
2.函数
2.1 函数本身也是一个对象,可以作为参数传入。
double add(double a,double b,deal){
return deal(a)+deal(b);
}
调用:
var fun = (double i) {
return i * i;
};
print(add(3, 4, fun));//求两数的平方和
2.2 函数的简写
var fun = (double i) {
return i * i;
};
可以简写为:
var fun = (i) {
return i * i;
};
进一步可以简写为:
var fun = (i)=> i * i;
3.接口
实现接口的类拥有该接口的功能。比如num是实现了Comparable接口的,可以说明它有作比较的能力。
接口的实现的关键字是implements。
abstract class num implements Comparable {
Dart中的接口也是支持多实现的,用逗号隔开。比如String即实现Comparable,也实现了Pattern,
说明String同时可具有这两种功能。
abstract class String implements Comparable, Pattern {
定义一个操作接口:
abstract class Operable{
void reflex();//反向
void reflexX();//X反向
void reflexY();//Y反向
void scale(num xRate,num yRate);//缩放
void translate(num dx,num dy);//平移
void rotate(num deg,[isAnticlockwise=true]);//旋转
}
继承接口实现方法
class Vector2 implements Operable{
num x;
num y;
Vector2(this.x,this.y);
Vector2.fromMap(Map point){
this.x = point['x'];
this.y = point['y'];
}
@override
void reflex() {
this.x=-x;
this.y=-y;
}
@override
void reflexX() {
this.x=-x;
}
@override
void reflexY() {
this.y=-y;
}
@override
void rotate(num deg, [isAnticlockwise = true]) {
var curRad = rad + deg*pi/180;
this.x=distance*cos(curRad);
this.y=distance*sin(curRad);
}
@override
void scale(num xRate, num yRate) {
this.x *=xRate;
this.y *=yRate;
}
@override
void translate(num dx, num dy) {
this.x +=dx;
this.y +=dy;
}
@override
String toString() {
return '(${this.x},${this.y})';
}
}
4.库
4.1 类库中的命名冲突 as关键字
---->[utils/color_utils.dart]----
sin(double d){
}
---->[main.dart:5]----
import 'package:toly/utils/color_utils.dart';
import 'dart:math';
void main() {
sin(5);
}
---->[解决方案]----
import 'package:toly/utils/color_utils.dart' as myMath;
import 'dart:math';
void main() {
myMath.sin(5);
}
4.2 控制显示隐藏导入
import 'package:toly/utils/color_utils.dart' show sin;//只显示sin函数
import 'package:toly/utils/color_utils.dart' hide sin;//只隐藏sin函数
4.3 控制访问权限
Dart中没有private,public,protected修饰符,默认是可以被访问的。
Dart中规定,名称前加下划线可以限制外部的访问,如下_age。
方法名,文件名也是如此,不想对外暴露,前面加下划线即可
---->[painter/person.dart]----
class Person{
String name;
int _age;
Person(this.name,this._age);
say(){
print("my name is $name and i am $_age years old.");
}
}
---->[main.dart]----
void main() {
var toly = Person("toly", 25);
toly.say();//my name is toly and i am 25 years old.
print(toly._age);//报错
}
5.多继承
5.1 mixin
mixin是一个定义类的关键字。直译出来是混入,混合的意思
Dart为了支持多重继承,引入了mixin关键字,它最大的特殊处在于:mixin定义的类不能有构造方法
,这样可以避免继承多个类而产生的父类构造方法冲突
关于混入的方法重名,取后混入的方法
class Runner {
go(){
print("Runner-go");
}
}
mixin Walker{
go(){
print("Walker-go");
}
}
class Person with Runner,Walker{
Person(){
print("Person");
}
}
main(){
Person toly = Person();
toly.go();//Walker-go
}