/// 传统的面向对象写法 单继承class Item {double price;String name;Item(name, price) {this.name = name;this.price = price;}}class ShoppingCart {String name;DateTime date;String code;List<Item> bookings;ShoppingCart(name, code) {this.name = name;this.code = code;this.date = DateTime.now();}price() {double sum = 0.0;for (var i in bookings) {sum += i.price;}return sum;}getInfo() {return '购物车信息:' +'\n----------------------' +'\n 用户名:' + name +'\n 优惠码:' + code +'\n 总价:' + price().toString() +'\n 日期:' + date.toString() +'\n---------------------';}}main() {ShoppingCart sc = ShoppingCart("张三", '123456');sc.bookings = [Item("aa", 10.0), Item("bb", 20.0)];print(sc.getInfo());}
通过重构修改了上面的代码,用到了许多dart才有的特性
1、简化构造过程,构造函数简写
2、命名构造函数,一个类可以有多个构造函数
3、构造时初始化额外参数,super前初始化
4、简单成员函数用get或者set关键字改造
5、a??b运算符替代三元运算符
6、重载类的+(加号)运算符
7、连级运算符
abstract class PrintHelper {printInfo() => print(getInfo());getInfo();}class Meta {double price;String name;Meta(this.name, this.price);}class Item extends Meta {Item(name, price) : super(name, price);Item operator +(Item item) => Item(name + item.name, price + item.price);}class ShoppingCart extends Meta with PrintHelper {DateTime date;String code;List<Item> bookings;ShoppingCart({name}) : this.withCode(name: name, code: null);ShoppingCart.withCode({name, this.code}): date = DateTime.now(),super(name, 0);double get price => bookings.reduce((value, element) => value + element).price;getInfo() => '''购物车信息:---------------------用户名:$name优惠码:${code ?? '无'}总价:$price日期:$date---------------------''';}main() {ShoppingCart.withCode(name: "张三", code: '123456')..bookings = [Item("aa", 10.0), Item("bb", 20.0)]..printInfo();}
