Dart9
var cf = new ClassFunction();
var out = cf("dongnao","flutter,","damon");
print('$out'); // 输出 dongnao flutter, damon!
print(cf.runtimeType); // 输出 ClassFunction
print(out.runtimeType); // 输出 String
print(cf is Function); // 输出 false
//重载操作符
final v1 = Vector(2, 3);
final v2 = Vector(2, 2);
final r1 = v1 + v2;
final r2 = v1 - v2;
print([r1.x, r1.y]); //输出 [4, 5]
print([r2.x, r2.y]); //输出 [0, 1]
}
class Point {
num x;
num y;
var distanceFromOrigin;
//普通构造函数
// Point(num x, num y){
// this.x = x;
// this.y = y;
// }
//简化构造
// Point(this.x, this.y);
//命名构造函数
Point.fromJson(Map json) {
x = json['x'];
y = json['y'];
}
//重定向构造函数 使用冒号调用其他构造函数
Point.alongXAxis(num x) : this(x, 0);
//初始化列表
Point(this.x, this.y) : distanceFromOrigin = sqrt(x * x + y * y);
@override
String toString() {
// TODO: implement toString
return 'Point(x = y)';
}
}
class Parent {
int x;
int y;
//超类命名构造函数不会传递,如果希望使用超类中定义的命名构造函数创建子类,则必须在子类中实现该构造函数
Parent.fromJson(x, y)
: x = x,
y = y {
print('超类命名构造函数');
}
}
class Child extends Parent {
int x;
int y;
//如果超类没有默认构造函数, 则你需要手动的调用超类的其他构造函数
Child(x, y) : super.fromJson(x, y) {
//调用超类构造函数的参数无法访问 this
print('子类构造函数');
}
//在构造函数的初始化列表中使用 s 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 uper(),需要把它放到最后
Child.fromJson(x, y)
: x = x,
y = y,
super.fromJson(x, y) {
print('子类命名构造函数');
}
}
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 = y)';
}
}
class Singleton {
String name;
static Singleton _cache; //工厂构造函数无法访问 this。所以这里要静态的
//工厂构造函数,关键字 factory
//工厂构造函数是一种构造函数,与普通构造函数不同,工厂函数不会自动生成实例,而是通过代码来决定返回的实例对象.
// factory Singleton([String name = 'singleton']) {
if(Singleton._cache == null){
Singleton._cache=new Singleton._newObject(name);
}
return Singleton._cache;
//
// return Singleton._cache ??= Singleton._newObject(name);
// }
factory Singleton([String name = 'singleton']) =>
Singleton._cache ??= Singleton._newObject(name);
//定义一个命名构造函数用来生产实例
Singleton._newObject(this.name);
}
//工厂函数
class Massage {
void doMassage(){
print('按摩');
}
}
class FootMassage extends Massage {
@override
doMassage() {
print('脚底按摩');
}
}
class BodyMassage extends Massage {
@override
void doMassage() {
print('全身按摩');
}
}
class SpecialMassage extends Massage {
@override
void doMassage() {
print('特殊按摩');
}
}
Massage massageFactory(String type){
switch (type) {
case 'foot':
return new FootMassage();
case 'body':
return new BodyMassage();
default:
return new SpecialMassage();
}
}
//工厂模式
//abstract class Massage {
// factory Massage(String type) {
// switch (type) {
// case 'foot':
// return new FootMassage();
// case 'body':
// return new BodyMassage();
// default:
// return new SpecialMassage();
// }
// }
//
// void doMassage();
//}
//
//class FootMassage implements Massage {
// @override
// doMassage() {
// print('脚底按摩');
// }
//}
//
//class BodyMassage implements Massage {
// @override
// void doMassage() {
// print('全身按摩');
// }
//}
//
//class SpecialMassage implements Massage {
// @override
// void doMassage() {
// print('特殊按摩');
// }
//}
//setter getter
//每个实例变量都隐含的具有一个 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);
// getter 和 setter 的好处是,可以开始使用实例变量,后面可以把实例变量用函数包裹起来,而调用你代码的地方不需要修改。
//获取 right 值
num get right => left + width;
//设置 right 值,同时 left 也发生变化
评论