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
复制代码
相关文章
相关标签/搜索