Dart2基础(八) - 类和枚举

本文详细介绍了Dart2中的类,包括类的定义与使用、构造函数(如命名构造函数、重定向构造函数、静态构造函数、工厂构造函数)、实例变量、抽象类和方法、枚举类型以及mixins。还探讨了对象类型获取、类的继承、重载运算符等关键概念,为理解Dart2的面向对象编程提供了全面的指南。
摘要由CSDN通过智能技术生成

目录

类的定义和使用

获取对象类型

实例变量

构造函数

子类构造函数

重定向构造函数

静态构造函数

工厂构造函数

实例方法

抽象类和方法

隐式接口

类的继承

重载运算符

枚举

mixins

类变量和方法


Dart2中的类都是继承于类Object。Dart2中每一个类都有有一个超类(Object除外),但是一个类的主体可以在多个类层次中使用。

  • 类的定义和使用

Dart2中使用关键字class定义类,用.和?.调用类的成员。?.的用法是当对象不为空时,调用成员,为空时,跳过不调用。

class Animal{

  String name;

  // 构造函数
  Animal(String name){
    this.name = name;
  }

  run(){
    print("${this.name} is running");
  }
}

main(List<String> args) {
  // 使用构造函数创建对象
  var cat = Animal("cat"); 
  // 也可以用new来创建对象,new从Dart2开始是可选的
  var dog = new Animal("dog");
  cat.run();
  dog.run();
  // cat不是null时,name赋予新值
  cat?.name = "small cat";
  cat.run(); // small cat is running;
  Animal nullAnimal;
  // nullAnimal是null,如果直接使用nullAnimall.name,会对象为空的报错
  nullAnimal?.name = "null";
}
  • 获取对象类型

每一个对象都有一个runtimeType的属性,通过这个属性可以获取到该对象的类型(Type的对象)。

class Animal(){}

main(){
    // 返回的是一个Type的对象
    print(Animal().runtimeType); // Animal
}
  • 实例变量

每一个实例变量都有一个隐式的Get方法,如果变量不是final类型的,那么实例变量会有一个隐式的Set方法。

如果一个实例变量有初始值,那么它的值在构造方法生效之前,就已经被赋予。

如果想重写Get和Set方法,可以用关键字get和set实现。

Dart2中以_开头的变量和方法,都是私有的。

// 官网实例代码
class Rectangle {
  num left = 10;
  num _left_width = 12; // 私有变量
  
  // 定义多个变量
  num top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  // 定义两个计算属性: right and bottom.
  // 需要注意的是,get和set需要成对出现
  // 重写get
  num get right => left + width;
  // 重写set
  set right(num value) => left = value - width;
  num get bottom => top + height;
  set bottom(num value) => top = value - height;
}

void main() {
  var rect = Rectangle(3, 4, 20, 15);
  assert(rect.left == 3);
  rect.right = 12;
  assert(rect.left == -8);
}
  • 构造函数

构造函数的定义,可以通过函数名为ClassName和ClassName.identifier(命名的构造函数 Named Constructors)定义。

通过命名的构造函数可以轻松实现多个不同的构造函数。

如果类没有构造函数,那么默认会有一个没有参数的构造函数。

class Animal{

  String name;

  String color = "yellow";
  
  Animal(String name){
    this.name = name;
  }
  // 上面的构造函数,可以简写为
  Animal(this.name);

  Animal.createInstance(Map values){
    name = values["name"];
  }

  run(){
    print("${this.name} is running");
  }
}
main(List<String> args) {
  var animal = Animal.createInstance({"name": "dog"});
  print(animal.name);
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值