dart 語法的 構造函數生成 繼承 實現 泛型 導包方式java
//普通構造函數
class Point {
num x;
num y;
Point(num x, num y){
this.x = x;
this.y = y;
}
}
複製代碼
class Point {
num x;
num y;
//簡化構造
Point(this.x, this.y);
}
複製代碼
class Point {
num x;
num y;
//命名構造函數
Point.fromJson(Map json) {
x = json['x'];
y = json['y'];
}
}
複製代碼
class Point {
num x;
num y;
Point(this.x, this.y);
//重定向構造函數 使用冒號調用其餘構造函數
Point.alongXAxis(num x) : this(x, 0);
}
複製代碼
class Parent {
int x;
int y;
//超類命名構造函數不會傳遞,若是但願使用超類中定義的命名構造函數建立子類,則必須在子類中實現該構造函數
Parent.fromJson(x, y)
: x = x,
y = y {
}
}
class Child extends Parent {
int x;
int y;
//若是超類沒有默認構造函數, 則你須要手動的調用超類的其餘構造函數
Child(x, y) : super.fromJson(x, y) {
//調用超類構造函數的參數沒法訪問 this
}
//在構造函數的初始化列表中使用 super(),須要把它放到最後
Child.fromJson(x, y)
: x = x,
y = y,
super.fromJson(x, y) {
}
}
複製代碼
用const 建立的對象 爲同一個對象 var p2 = const Point2(4, 4);//常量對象 var p21 = Point2(4, 4); //建立的是非 常量對象
json
class Point2 {
//定義const構造函數要確保全部實例變量都是final
final num x;
final num y;
static final Point2 origin = const Point2(0, 0);
//const關鍵字放在構造函數名稱以前,不能有函數體
const Point2(this.x, this.y);
@override
String toString() {
return 'Point2(x = $x, y = $y)';
}
}
複製代碼
class Singleton {
String name;
static Singleton _cache; //工廠構造函數沒法訪問 this。因此這裏要靜態的
//工廠構造函數,關鍵字factory
//工廠構造函數是一種構造函數,與普通構造函數不一樣,工廠函數不會自動生成實例,而是經過代碼來決定返回的實例對象.
factory Singleton([String name = 'singleton']) => Singleton._cache ??= Singleton._newObject(name);
//定義一個命名構造函數用來生產實例
Singleton._newObject(this.name);
}
複製代碼
每一個實例變量都隱含的具備一個 getter, 若是變量不是 final 的則還有一個 setter,能夠經過實行 getter 和 setter 來建立新的屬性, 使用 get 和 set 關鍵字定義 getter 和 setter安全
class Rectangle {
num left;
num top;
num width;
num height;
Rectangle(this.left, this.top, this.width, this.height);
//獲取right值
num get right => left + width;
//設置right值,同時left也發生變化
set right(num value) => left = value - width;
//獲取bottom值
num get bottom => top + height;
//設置bottom值,同時top也發生變化
set bottom(num value) => top = value - height;
}
複製代碼
能夠對對象進行比較 + - * / > <bash
//重載操做符
class Vector {
final int x;
final int y;
const Vector(this.x, this.y);
//重載+
Vector operator +(Vector v) {
return new Vector(x + v.x, y + v.y);
}
//重載-
Vector operator -(Vector v) {
return new Vector(x - v.x, y - v.y);
}
}
複製代碼
使用方式ide
//重載操做符
final v1 = Vector(2, 3);
final v2 = Vector(2, 2);
final r1 = v1 + v2;
final r2 = v1 - v2;
print([r1.x, r1.y]);
print([r2.x, r2.y]);
複製代碼
java 不能夠多繼承在dart中 with 來實現多繼承函數
class Car extends Transportation
with
FourWheelTransportation,
MiddleSafetyIndex,
GasolineEnergyTransportation {
@override
void transport() {
print(
"汽車:\n動力組件: ${powerUnit()} , 安全指數: ${safetyIndex()} , 動力來源:${energy()}");
}
複製代碼
//構造函數泛型
class Phone<T> {
final T mobileNumber;
Phone(this.mobileNumber);
}
複製代碼
//泛型函數
K addCache<K, V>(K key, V value) {
K temp = key;
print('${key}: ${value}');
return temp;
}
複製代碼
//泛型限制
class Massage<T extends FootMassage > {
final T massage;
Massage(this.massage);
}
複製代碼
import 'dart:math'; //載入核心庫
import 'package:dio/dio.dart'; //載入第三方庫
import 'mylib1.dart' as lib1; //載入文件
import 'mylib2.dart' as lib2; //若是兩個庫有衝突的標識符,能夠爲其中一個或兩個庫都指定前綴
import 'mylib1.dart' as lib1 show Test; //只載入庫的某些部分
import 'mylib2.dart' as lib2 hide Test; //篩選掉庫的某些部分
import 'mylib1.dart' deferred as lazyLib; //延遲載入
import 'mylib/mylib.dart';//載入自定義庫****
//組合導入
library material;
export 'ScreenAdapter.dart';
export 'AutoSizeConfig.dart';
複製代碼