学习flutter必会的dart知识(三)

大伙都知道写flutter的语言是dart,所以深入flutter前还是有一些dart的基础知识需要了解。 本文翻译自

如果不喜欢看中文请自行查看英文版thetechnocafe.com

今天学习现代编程语言最重要的一个部分,没有这个特性的现代语言甚至是不完整的。他就是类。dart里的类非常直观简单。

下面的代码声明了一个类,并创建了一个类的实例

main(List<String> args) {
  Dog d = new Dog();
}
 
class Dog {
 
}

通过类的构造函数给实例添加变量,下面给Dog类增加了name字段和age字段

main(List<String> args) {
  Dog d = new Dog('Duffy', 2);
  print(d.name);
}
 
class Dog {
  String name;
  int age;
 
  Dog(String name, Stirng age) {
    this.name = name;
    this.age = age;
  }
}

dart 提供了语法糖,用来生成构造函数,如:

main(List<String> args) {
  Dog d = new Dog('Duffy', 2);
  print(d.name);
}
 
class Dog {
  String name;
  int age;
 
  Dog(this.name, this.age);
}

上面的代码只用一行代码就完成了构造函数,第一个参数,对应到name

第二个参数对应age

命名构造函数

dart提供的另一个定义构造函数的方法,叫做 命名构造函数

如:

main(List<String> args) {
  Dog d = new Dog.newBorn();
  print(d.name);
}
 
class Dog {
  String name;
  int age;
 
  Dog(this.name, this.age);
 
  Dog.newBorn() {
    name = 'Doggy';
    age = 0;
  }
}

上面的代码,构造函数有了一个名字(newBorn), 这样在初始化时更清楚使用了哪个类

继承

dart里继承用关键字 extend

main(List<String> args) {
  Pug p = new Pug('Duffy', 5);
  print(p.name);
}
 
class Dog {
  String name;
  int age;
 
  Dog(this.name, this.age);
 
  Dog.newBorn() {
    name = 'Doggy';
    age = 0;
  }
}
 
class Pug extends Dog {
  Pug(String name, int age): super(name, age);
}

Pug类继承了Dog类,并且在Pug的构造函数里用SUPER关键字调用了Dog类的构造函数,

在一个类里还可以调用其他的构造函数,通过在(:)冒号后调用this关键字

main(List<String> args) {
  Pug p = new Pug.small('Duffy');
  print(p.name);
}
 
class Dog {
  String name;
  int age;
 
  Dog(this.name, this.age);
 
  Dog.newBorn() {
    name = 'Doggy';
    age = 0;
  }
}
 
class Pug extends Dog {
  Pug(String name, int age): super(name, age);
 
  Pug.small(Stirng name): this(name, 1);
 
  Pug.large(Stirng name): this(name, 3);
}

上面定义了两个命名构造函数, small 调用了自身的构造函数,而自身又调用了dog的构造函数。

方法

方法定义和dart里单独定义一个函数是一样的,

main(List<String> args) {
  Dog d = new Dog('Duffy', 10);
  d.bark();
}
 
class Dog {
  String name;
  int age;
 
  Dog(this.name, this.age);
 
  Dog.newBorn() {
    name = 'Doggy';
    age = 0;
  }
 
  bark() {
    print('Bow Wow');
  }
}

函数重写

main(List<String> args) {
  Pug p = new Pug.small('Duffy');
  p.bark();
}
 
class Dog {
  String name;
  int age;
 
  Dog(this.name, this.age);
 
  Dog.newBorn() {
    name = 'Doggy';
    age = 0;
  }
 
  bark() {
    print('Bow Wow');
  }
}
 
class Pug extends Dog {
  Pug(String name, int age): super(name, age);
 
  Pug.small(Stirng name): this(name, 1);
 
  Pug.large(Stirng name): this(name, 3);
 
  @override
  bark() {
    print('Meow!');
  }
}

getter setter

默认的情况下类里定义的任何变量都是可以访问的,如dog.name,变量的值也可以直接读写。但是有时候不希望直接读写而是通过getter setter。dart里 是通过get set 关键字实现的

如:

main(List<String> args) {
  Dog d = new Dog('Duffy', 5);
  d.respectedName = 'Mr.Duffy';
  print(d.respectedName);
}

class Dog {
  String name;
  int age;

  Dog(this.name, this.age);

  String get respectedName {
    return 'Mr.$name';
  }

  set respectedName(String newName) {
    name = newName;
  }

  Dog.newBorn() {
    name = 'Doggy';
    age = 0;
  }

  bark() {
    print('Bow Wow');
  }
}

上面的代码 name 属性依然是可读写的

可访问性

默认类里的任何属性都是public的,也是是公开的,可以直接访问,如果想保护变量,使变量变成私有的private,只要在变量名称前加”_”即可,如:

main(List<String> args) {
  Dog d = new Dog('Duffy', 5);
  print(d.name);  //This will throw error
}

class Dog {
  String _name;
  int age;

  Dog(this.name, this.age);

  String get respectedName {
    return 'Mr.$name';
  }

  set respectedName(String newName) {
    name = newName;
  }

  Dog.newBorn() {
    name = 'Doggy';
    age = 0;
  }

  bark() {
    print('Bow Wow');
  }

  _hiddenMethod() {
    print('I can only be called internally!');
  }
}

抽象类和方法

抽象类用abstract关键字

abstract class AbstractDog {
  void bark();
 
  void _hiddenMethod();
}

上面只是在类前增加了 abstract 关键字,方法前不需要加。类方法也只是声明了,不需要具体实现。

静态方法

在字段或方法前增加static关键字就变成了静态,如:

main(List<String> args) {
  Dog.bark(); 
}
 
class Dog {
  String name;
  int age;
 
  Dog(this.name, this.age);
 
  static bark() {
    print('Bow Wow');
  }
}

枚举Enum

dart 支持枚举类型 如果你熟悉其他的编程语言如Java那么,对枚举就非常了解了

main(List<String> args) {
  Dog d = new Dog('Duffy', 12, CurrentState.sleeping);
  print(d.state == CurrentState.sleeping); //Prints 'true'
}
 
enum CurrentState {
  sleeping,
  barking,
  eating,
  walking
}
 
class Dog {
  String name;
  int age;
  CurrentState state;
 
  Dog(this.name, this.age, this.state);
 
  static bark() {
    print('Bow Wow');
  }
}

泛型

dart支持泛型,如有一个类,管理一个数据,希望这个数据是任何类型。

main(List<String> args) {
  DataHolder<String> dataHolder = new DataHolder('Some data');
  print(dataHolder.getData());
  dataHolder.setData('New Data');
  print(dataHolder.getData());
}
 
class DataHolder<T> {
  T data;
 
  DataHolder(this.data);
 
  getData() {
    return data;
  }
 
  setData(data) {
    this.data = data;
  }
}

    原文作者:xyz
    原文地址: https://zhuanlan.zhihu.com/p/39866682
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞