Dart的基本语法之类

类构造方法

命名构造和继承父类构造方法

void main(){
	print(Child(3,2)); /输出a=3 b=2,已经赋值给了父类里面的两个变量。
}
class Child extends Parent {
  int c;
  int d;

  Child(num a, num b)
      : c = a,
        d = b,
        super(a, b) {
    print('子类构造函数');
  }
  
  Child.fromMap(Map map) : super.fromMap(map) {
    print('子类命名构造函数');
  }
  
  Child.redirect(num a) : super.redirect(a) {}
}

//父类
class Parent {
  int a;
  int b;

  Parent(this.a, this.b);
  
	/命名构造函数
  Parent.fromMap(Map map) {
    this.a = map['a'];
    b = map['b'];
  }
  
	/重定向构造函数,通过冒号来调用其它构造函数
  Parent.redirect(int a) : this(a, 0);

  @override
  String toString() {
    return 'a=' + a.toString() + '  b=' + b.toString();
  }
}

常量构造函数

变量用final修饰,构造方法用const修饰

class Point2 {
  final int q;
  final int w;

  const Point2(this.q, this.w);
}

需要注意的一点:如果用const修饰new出来的对象,里面变量赋值一样,则共用一块内存地址。

/因为Point2的构造方法用const修饰的,所以这里在new的时候可以用const修饰
Point2 p1=const Point2(3,4);
Point2 p2=const Point2(3,4);

/上面构造方法都传入的34,下面输出结果为true
print(identical(p1,p2));

工厂构造函数,工厂模式

class AA {
  String name;
  static AA aa;

  /工厂构造函数无法访问this
  /工厂构造函数不能自动生成实例,通过代码返回你想返回的实例对象
  /*factory AA([String name = 'AA']) {
    if (AA.aa == null) {
      AA.aa = AA._newObject(name);
    }
    return AA.aa ;
  }*/
	/上面的方法可以简写成下面的格式
  factory AA([String name = 'AA'])=> AA.aa ??= AA._newObject(name);

  AA._newObject(this.name);
}

可调用类

void main(){
  var cf=ClassFunc();
  var out =cf('tt','uu');
  print(out.runtimeType); /输出String
  print(out);    /输出tt uu
  print(out is Function); /输出false
}

/这个类可以当方法调用
class ClassFunc{
  /函数名必须是call
  call(String a,String b)=>'$a  $b';
}

继承和Mixin

with的优先级比extends高,同时使用with和extends时,默认会继承with后面最后一个类里面的方法。
只使用implements时必须重写父类里面的所有方法。

void main() {
  print(AB().getMessage());/输出B
  print(BA().getMessage());/输出A
  print(C().getMessage()); /输出C
  print(CC().getMessage()); /输出B
}

/顺序问题
/如果2个或多个超类拥有相同签名的A方法,那么子类会以继承的最后一个超类中的A方法为准。
/当然这是子类没有重写A方法的前提下,如果子类自己重写了A方法则以本身的A方法为准
class A {
  String getMessage() => 'A';
}

class B {
  String getMessage() => 'B';
}

class P {
  String getMessage() => 'P';
}

class AB extends P with A, B {}

class BA extends P with B, A {}

class C extends P with B, A {
  String getMessage() => 'C'; /优先级最高的是在具体类中的方法。
}

class CC extends P with B implements A {
} /这里的implement只是表明要实现A的方法,这个时候具体实现是再B中mixin了具体实现

/实现A必须重写A里面所有的方法
class D implements A {
  @override
  String getMessage() {
    return 'D';
  }
}

泛型

Dart中泛型使用基本上和Java是一样的,也有一些不一样的地方。
Java中的泛型信息是编译时的,泛型信息在运行时是不存在的。
Dart的泛型类型是固化的,在运行时也有可以判断的具体类型。

var names = List<String>();
print(names is List<String>); /输出true
print(names.runtimeType); 	/输出List<String>

泛型限制

main() {
  var footMassage = FootMassage();
  var m = Massage<FootMassage>(footMassage);
  m.massage.doMassage();
}

class Massage<T extends FootMassage > {
  final T massage;
  Massage(this.massage);
}

class FootMassage {
  void doMassage() {
    print('脚底按摩');
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值