Dart 语言学习 06 类

Dart 语言学习 06

Author : ScorpioDong

1. 类

Dart是一种面向对象的语言。它支持面向对象的编程功能,如类,接口等。OOP方面的类是创建对象的蓝图/模板。类封装了对象的数据。Dart为类概念提供了内置支持。

1.1 类的声明

  • 使用class关键字在Dart中声明一个类。
  • 类定义以关键字class开头,后跟类名。
  • 类名建议使用大驼峰命名法。
  • 类名后跟一对大括号包裹的类体。
class Test {
    // Fields
    String name;
    // Getters and Setters
    // Constructors
    Test() {
        this.name = "张三";
    }
    // Functions
    void eat() {
        print("$name eatting...");
    }
}

类体中的Fields、Getters and Setters、 Constructors和Functions都是可选的,按需定义

  • 字段(fields) - 字段是类中声明的任何变量,字段表示与对象有关的数据。
  • setters和getters - 允许程序初始化和检索类字段的值,默认的getter/setter与每个类相关联。但是可以通过显式定义setter/getter来覆盖默认值。
  • 构造函数(constructors) - 负责为类的对象分配内存。
  • 函数(functions) - 函数表示对象可以采取的操作,它们有时也称为方法。

1.2 类的实例和属性函数访问

使用new 关键字后跟类名创建类的实例。

main() {
    var obj = new Test();
    print(obj.name);
    obj.eat();
}
class Test {
    // Fields
    String name;
    // Getters and Setters
    // Constructors
    Test() {
        this.name = "张三";
    }
    // Functions
    void eat() {
        print("$name eatting...");
    }
}

通过类的实例化对象访问类的属性和方法。使用.点来访问累的数据成员。

1.3 构造函数

  • 构造函数是类的特殊函数,负责初始化类的变量。
  • Dart中的构造函数是与类名相同的函数。
  • 构造函数可以存在形参。构造函数没有返回值。
  • 如果未显示提供构造函数,Dart默认提供一个无参的空构造函数。
class Test {
    // Fields
    String name;
    // Getters and Setters
    // Constructors

    Test() { // <--构造函数,初始化了name变量
        this.name = "张三";
    }
    // Functions
    void eat() {
        print("$name eatting...");
    }
}

Dart提供了命名构造函数,使类可以定义多个构造函数。
语法 类名.构造方法名(形参列表) {函数体}

class Test {
    // Fields
    String name;
    // Getters and Setters
    // Constructors

    // 构造函数,初始化了name变量
    Test() {
        this.name = "张三";
    }

    // 命名构造函数
    Test.nameTest(String name) {
        this.name = name;
    }
    // Functions
    void eat() {
        print("$name eatting...");
    }
}

1.4 this关键字

this关键字引用类的当前实例。这里,参数名称和类字段的名称是相同的。因此,为了避免歧义,类的字段以this关键字为前缀。

class Test {
    // Fields
    String name;
    // Getters and Setters
    // Constructors

    // 构造函数,初始化了name变量
    Test() {
        this.name = "张三"; // this关键字的使用
    }

    // 命名构造函数
    Test.nameTest(String name) {
        // this关键字的使用,因为字段名和形参名一样,冲突
        this.name = name; 
    }
    // Functions
    void eat() {
        print("$name eatting...");
    }
}

1.5 Getter and Setter

Getters和Setter(也称为访问器和更改器)允许程序分别初始化和检索类字段的值。使用get关键字定义getter或访问器。Setter或存取器是使用set关键字定义的。

默认的getter/setter与每个类相关联。但是,可以通过显式定义setter/getter来覆盖默认值。getter没有参数并返回一个值,setter只有一个参数但不返回值。

main(List<String> args) {
  var a = new Test();
  a.test_name = "李四";
  print(a.test_name);  
}

class Test {
    // Fields
    String name;
    // Getters and Setters

    // 定义name 的 Getter
    String get test_name {
        return name;
    }

    // 定义name 的 Setter
    void set test_name(String name) {
        this.name = name;
    }

    // Constructors

    // 构造函数,初始化了name变量
    Test() {
        this.name = "张三"; // this关键字的使用
    }

    // 命名构造函数
    Test.nameTest(String name) {
        // this关键字的使用,因为字段名和形参名一样,冲突
        this.name = name; 
    }
    // Functions
    void eat() {
        print("$name eatting...");
    }
}

1.6 封装

  • Dart没有private、public等权限修饰符。
  • 可以使用_下划线为标识符添加前缀,标记为私有。
class Test {
    // Fields
    String _name; //标记私有外部无法访问
    // Getters and Setters

    // 定义name 的 Getter
    String get test_name {
        return _name;
    }

    // 定义name 的 Setter
    void set test_name(String name) {
        this._name = name;
    }

    // Constructors

    // 构造函数,初始化了name变量
    Test() {
        this._name = "张三"; // this关键字的使用
    }

    // 命名构造函数
    Test.nameTest(String name) {
        // this关键字的使用,因为字段名和形参名一样,冲突
        this._name = name; 
    }
    // Functions
    void eat() {
        print("$_name eatting...");
    }
}

1.7 继承

  • Dart支持继承的概念,它是程序从现有类创建新类的能力。扩展为创建较新类的类称为父类/超类。新创建的类称为子/子类。
  • 一个类使用extends关键字从另一个类继承。子类继承除父类的构造函数之外的所有属性和方法。
  • Dart的类只支持单继承模式,也就是一个类只能有一个父类。
main(List<String> args) {
  var obj = new B();
  print(obj.a);
}

class A {
  int a = 5;
}

class B extends A {

}

执行

5
方法重写
  • 方法重写是子类在其父类中重新定义方法的机制。
  • 重写方法使用@override标记。
  • 重写方法与父类方法的方法名,形参列表和返回值类型都要一致。
main(List<String> args) {
  var obj = new B();
  obj.F();
}

class A {
  int a = 5;
  F() {
    print("123");
  }
}

class B extends A {
  @override
  F() {
      print("456");
    }
}

执行

456
发布了59 篇原创文章 · 获赞 45 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/m0_37771142/article/details/105036412