Dart-类
2019-07-27 本文已影响0人
哎呀啊噢
Dart是一种面向对象的编程语言.支持面向对象的特性,比如类、接口、抽象等;
- 使用class关键字声明一个dart类,后面跟类名,并且由一对花括号包围的类体
- 所有类都有同一个基类,Object,dart的继承机制使用了Mixin;
代码示例:
class class_name {
<fields>
<getters/setters>
<constructors>
<functions>
}
类包含:
- <fields>字段,类中声明任何变量、常量;
- <getters/setters> 如果对象为final,或const,只有一个getter方法
- <constructors> 构造函数,为类的对象分配内存
- <functions>函数,也叫方法,对象的操作;
构造方法
- 默认构造方法
- 命名构造方法Class.name(var param)
- 调用父类构造方法
- 不可变对象,定义编译时常量对象,构造函数前加const
- 工厂构造函数:factory
代码示例
//声明三个实例变量,所有的实例变量都会自动生成一个getter方法,没有声明为final的实例变量还会生成一个setter方法
class Point {
num x; //声明实例变量x,初始值为null
num y; //声明实例变量y,初始值为null
num z = 0; //声明实例变量z,初始化为0
Point(){}//默认生成一个无参的构造方法
Point.fromXYZ(num x, num y, num z) {//命名构造方法,可以创建多个构造方法
this.x = x;
this.y = y;
this.z = z;
print("Point");
}
//简写
// Point.fromXYZ(this.x,this.y,this.z);
}
//调用
void main(){
Point point = new Point();//new 构造
point.x = 1;
point.y = 2;
point.z = 3;
Point point1 = Point.fromXYZ(1, 2, 3);//命名构造
}
//调用父类构造方法
class ColorPoint extends Point{
String color;
ColorPoint.fromXYZAndColor(num x, num y, num z, String color)
:super.fromXYZ(x,y,z){
this.color = color;
print('ColorPoint');
}
}
//调用
void main(){
var p = ColorPoint.fromXYZAndColor(1, 2, 3, "color");
print(p);
}
//常量构造方法
/*
* 定义一个const构造方法 ,所以变量声明为final
* */
class ImmutablePoint {
final num x;
final num y;
const ImmutablePoint(this.x, this.y);
static final ImmutablePoint origin =
const ImmutablePoint(0, 0);
}
//工厂构造方法 如果一个构造方法并不总是返回一个新的对象,这个时候可以使用factory来定义这个构造方法。
class Logger {
final String name;
bool mute = false;
static final Map<String, Logger> _cache =
<String, Logger>{};
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = new Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) {
print(msg);
}
}
}
//调用
void main(){
//工厂
var logger = new Logger('UI');
logger.log('Button clicked');}
要注意的是工厂构造方法时没法访问this关键字的,所以上面就有了在类的内部这么调用构造方法的代码:final logger = new Logger._internal(name);
在上面工厂构造方法中,如果缓存中存在传入的name的key值,则取出缓存中的对应value返回。
如果缓存中没找到,就会通过命名构造方法来新建一个对象,缓存起来后返回