3.6 命名构造函数与列表初始化 – 《简单易懂的Dart》

3.6.1 命名构造函数

传统的构造函数是一个与类名同名的方法,但是Dart还支持命名构造函数.

命名构造函数是一个类同名方法的子方法,它同样可以完成对类实例的构造.

下面我们定义一个简单的命名构造函数,它比类同名方法要省略一个参数.

class Box{  
  int width,height;
  Box(int this.width,int this.height);
  Box.equalRatios(int length){
    width=length;
    height=length;
  }
}

void main(){  
  Box a=new Box(100,100);
  Box b=new Box.equalRatios(100);
  print('${a.width} ${a.height}');
  print('${b.width} ${b.height}');
}

运行将输出两次”100 100″.

可见Box.equalRatios完成了构造函数的工作,在一些情况下是不是要方便很多?

3.6.2 列表初始化

列表初始化是Dart为了让类型为List和Map的参数更好用.

例如这样一个JSON格式的Map类型参数:

{
'width':100,  
'height':100  
}

我们可以直接在调用参数的阶段将这个参数映射为变量.

具体的看了下面这个例子就能明白:

class Box{  
  int width,height;
  Box.fromJSON(Map json):width=json['width'],height=json['height']{
    this.width=width;
    this.height=height;
  }
}

void main(){  
  Box c=new Box.fromJSON({'width':100,'height':100});
  print('${c.width} ${c.height}');
}

运行后将输出”100 100″.

这段代码中我们使用”:”在参数未到达函数执行体时将其属性赋值给了width和height.

是不是看”:”有点眼熟?其实我们在类的继承与重写中也使用过,我们使用:将参数传给了父类,完成了一次实例构造.

在这段代码中还有一个令人惊讶的事实是,同名的Box方法不见了,而是直接使用了Box.fromJSON作为构造函数.

最后需要注意的一点是,列表初始化是构造函数的特权,普通的成员方法不得使用.