Dart速通(四)- 異常處理和麪向對象

異常處理

拋出異常

拋出異常的例子bash

void test(){
  throw FormatException('拋出一個 FormatException 異常 ');
}
複製代碼

也能夠拋出任意對象函數

throw `數據非法`;
複製代碼

捕獲異常

你能夠指定一個或多個參數捕獲異常(catch),第一個是拋出的異常,第二個是堆棧跟蹤(StackTrace對象)。以下所示:ui

void test(){
    try{
        //....
    } on Exception catch(e){
        print('Exception details:\n $e');
    }catch(e,s){
        print('Exception details:\n $e');
        print('Stack trace:\n $s ');
    }
}
複製代碼

上面代碼第一個catch用來捕獲異常詳細信息,第二個catch是堆棧跟蹤信息。this

Finally

Finally和其餘的語言的finally效果同樣的。代碼示例以下spa

void test(){
    try{
        //....
    } on Exception catch(e){
        print('Exception details:\n $e');
    }catch(e,s){
        print('Exception details:\n $e');
        print('Stack trace:\n $s ');
    } finally {
        print('Do some thing:\n');
    }
}
複製代碼

不管如何都會走到finally塊中。.net

面向對象

Dart做爲高級語言支持面向對象的不少特性,而且支持基於mixin繼承方式。基於mixin的繼承方式是指:一個類能夠繼承多個父類,至關於其餘語言的多繼承。全部的類都有同一個基類Object,這個特性相似於Java語言,Java全部的類也都是繼承自Object,也就是說一切皆對象。 使用new語句實例化一個類,以下所示:code

//實例化一個User類的對象user
var user = new User('jack','20');
複製代碼

實例化成員變量

定義一個User類,在裏面添加成員變量nameage,以下:orm

class User{
    String name;
    int age;
}
複製代碼

類定義中全部的變量都會隱式的定義setter方法,針對非空的變量會額外增長getter方法。實例化User以下:對象

main() {
    var user = User();
    user.name='jack';//至關於使用了name的setter方法
    user.age=20;
}
複製代碼

構造函數

常規構造函數

代碼以下:blog

class User{
    String name;
    int age;
    User(String name,int age){
        this.name=name;
        this.age=age;
    }
}
複製代碼

也能夠簡寫

class User{
    String name;
    int age;
    User(this.name,this.age);
}
複製代碼

命名構造函數

使用命名構造函數從另外一類或現有的數據中快速實現構造函數,以下:

class User{
    String name;
    int age;
    User(this.name,this.age);
    //命名構造函數
    User.fromJson(Map map){
        name = map['name'];
        age = map['age'];
    }
}
複製代碼

構造函數初始化列表

除了調用父類的構造函數,也能夠經過初始化列表在子類的構造函數運行前來初始化實例成員變量值,代碼以下:

class User{
    final String name;
    final int age;
    User(name,age)
        :name=name,
         age=age;
}
main(){
    var u = User('cxl',21);
}
複製代碼

get()set()

get()set()是專門用於讀取和寫入對象的屬性方法,每一類的實例,系統都會隱式地包含有get()set()方法。 例如,定義一個矩形地類,有上、下、左、右四個成員變量:topbottomleftright,使用getset關鍵字分別對rightbottom進行獲取和設置值。以下

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;
}

main(){
  var rect = Rectangle(3,4,20,15);
  print('left:${rect.left}');
  print('right:${rect.right}');
  rect.right=30;
  print('修改 right 值爲 30');
  print('left:${rect.left}');
  print('right:${rect.right}');
  print('-------------------------------');
  print('top:${rect.top}');
  print('bottom:${rect.bottom}');
  rect.bottom=50;
  print('修改 bottom 值爲 50');
  print('top:${rect.top}');
  print('bottom:${rect.bottom}');
}
複製代碼

上面例子對應輸出爲:

left:3
right:23
修改 right 值爲 30
left:10
right:30
-------------------------------
top:4
bottom:19
修改 bottom 值爲 50
top:35
bottom:50

複製代碼

重載操做

編寫一個例子,定義一個Vector向量類,編寫兩個方法分別用於重載加號及減號,那麼當兩個向量相見,就表示他們的x值及y值相加,當兩個向量相減,就表示他們地x值及y值相減,以下:

//定義一個向量類
class Vector {
  final int x;
  final int y;
  const Vector(this.x,this.y);
  //重載加號 + (a+b)
  Vector operator +(Vector v){
    return new Vector(x+v.x, y+v.y);
  }
  //重載減號- (a -b)
  Vector operator - (Vector v){
    return new Vector(x-v.x, y-v.y);
  }
}

main(){
  //實例化兩個向量
  final v = Vector(2,3);
  final w = Vector(2,2);
  final r1=v+w;
  print('r1.x=${r1.x}\tr1.y=${r1.y}');
  final r2 = v - w ;
  print('r2.x=${r2.x}\tr2.y=${r2.y}');
}
複製代碼

上面例子輸出爲:

r1.x=4	r1.y=5
r2.x=0	r2.y=1
複製代碼

繼承、抽象、枚舉

Dart中的繼承、抽象、枚舉基本和Java一致嗎,沒啥好說的。

Mixins

Mixins(混入功能)至關於多繼承,也就是說能夠繼承多個類。 具體能夠參考這篇文章:HelloDart-MixIn,土話記錄多繼承機制

下面是個Mixins的小例子:

class S{
  a() => print('S.a');
}
class A{
  a()=>print('A.a');
  b()=>print('A.b');
}
class T = A with S; main(){
  var t = T();
  t.a();
  t.b();
}
複製代碼

以上代碼輸出以下:

S.a
A.b
複製代碼
相關文章
相關標籤/搜索