阅读 3618

Dart4Flutter – 03 – 类和泛型

Dart4Flutter -01 – 变量, 类型和 函数

Dart4Flutter – 02 –控制流 和异常

Dart4Flutter – 03 – 类和泛型

Dart4Flutter – 04 – 异步和库

Dart4Flutter-拾遗01-flutter-dart环境搭建

下面是创建一个类和创建类的实例。

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

现在我们给类添加实例变量和构造函数,添加age和name属性给Dog类。

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;
  }
}
复制代码

如上所示,给构造函数提供了名称,这样做使得不同的构造函数变的更加清晰。

Inheritance 继承

你可以使用extends关键字继承其他的类。

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类,通过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);
}
复制代码

如上所示,我们定义了两个命名构造函数,他们只需要dog的名字,然后调用Pug的默认构造函数。

方法

在类中定义方法和独立定义方法是一样的。

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 and Setters

默认,获取类中的任何变量都可以直接引用变量的名字。例如,dog.name,可以直接获取或者赋值name的值。但是有时候我们希望自定义属性的getter和setter方法,可以使用get和set关键字自定义getter和setter方法。

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属性是可以访问而且可以被随意修改。来让我处理一下,使name属性私有化。

访问控制

默认类中的所有属性和方法是public的。在dart中,可以在属性和方法名前添加“_”使私有化。现在让我们使name属性私有化。

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');
  }
}
复制代码

枚举

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;
  }
}
复制代码

结束

Dart4Flutter - 01 – 变量, 类型和 函数

Dart4Flutter – 02 –控制流 和异常

Dart4Flutter – 03 – 类和泛型

Dart4Flutter – 04 – 异步和库

参考

thetechnocafe.com/just-enough…

关注下面的标签,发现更多相似文章
评论