【Flutter】Dart:类

devtools/2024/10/23 3:29:56/

在 Dart 中,(Class)是面向对象编程的核心概念之一,提供了一种封装数据和功能的方式。理解 Dart 中的类以及它的相关特性是开发 Flutter 应用的基础。本教程将深入介绍 Dart 中类的定义、属性、构造函数、方法、接口、Mixin 以及枚举类,帮助你在 Flutter 应用开发中高效使用类。

Dart 中类的定义

在 Dart 中,类的定义使用关键字 class,类通常包含属性(变量)和方法(函数)。一个简单的类定义如下:

class Person {String name = '';int age = 0;void introduce() {print('My name is $name and I am $age years old.');}
}

在这个 Person 类中,nameage 是属性,introduce() 是类中的方法。我们可以通过创建该类的对象来访问这些属性和方法。

创建对象

void main() {Person person = Person();person.name = 'John';person.age = 25;person.introduce();  // 输出: My name is John and I am 25 years old.
}

属性

类的属性是它的成员变量,用于存储对象的状态或数据。在 Dart 中,属性既可以是实例变量,也可以是类变量(静态变量)。

实例变量

实例变量是属于对象的,每个对象都有独立的实例变量。它们在类的定义中直接声明,且可以通过对象访问。

class Car {String model;int year;Car(this.model, this.year);
}

静态变量

静态变量属于类而不是对象,它在类级别上共享。静态变量使用 static 关键字声明。

class Car {static int totalCars = 0;String model;int year;Car(this.model, this.year) {totalCars++;}
}

示例

void main() {Car car1 = Car('Tesla Model S', 2020);Car car2 = Car('BMW M3', 2021);print(Car.totalCars);  // 输出 2,表示已经创建了两个 Car 对象
}

构造函数

构造函数是用于创建类对象的方法。它通常用于初始化对象的属性。在 Dart 中,构造函数与类名相同。构造函数可以有多种形式:默认构造函数、命名构造函数、工厂构造函数等。

默认构造函数

当我们为类创建对象时,默认构造函数会被自动调用。以下是通过构造函数初始化类的属性的示例:

class Person {String name;int age;Person(this.name, this.age);  // 默认构造函数
}

命名构造函数

命名构造函数允许我们为一个类定义多个构造函数,每个构造函数有不同的名称。这样可以灵活地创建对象。

class Point {double x;double y;Point(this.x, this.y);// 命名构造函数Point.origin() {x = 0;y = 0;}
}

初始化列表

构造函数中的初始化列表允许在构造函数体执行之前初始化属性。它通常用于 final 变量。

class Rectangle {final int width;final int height;final int area;Rectangle(this.width, this.height) : area = width * height;
}

工厂构造函数

工厂构造函数用于控制对象的创建,并且可以返回现有对象而不是每次都创建新对象。使用 factory 关键字定义。

class Singleton {static final Singleton _instance = Singleton._internal();factory Singleton() {return _instance;}Singleton._internal();  // 私有构造函数
}

方法

类中的方法是可以执行某些操作的函数。Dart 中的方法可以像函数一样接收参数和返回值。可以在方法中定义常规方法、静态方法和 getter/setter。

实例方法

实例方法是作用于对象实例的方法。

class Circle {double radius;Circle(this.radius);double getArea() {return 3.14 * radius * radius;}
}

静态方法

静态方法与静态变量类似,属于类而不是对象。它们使用 static 关键字定义。

class MathUtil {static int square(int x) {return x * x;}
}void main() {print(MathUtil.square(5));  // 输出 25
}

Getter 和 Setter

Dart 中可以为属性定义 getter 和 setter 方法,允许控制对属性的访问和修改。

class Student {String _name;// getterString get name => _name;// setterset name(String name) {_name = name;}
}

接口(Interface)

在 Dart 中,所有的类都隐式实现了接口,因此可以通过实现某个类来创建接口。接口用于定义一组方法,这些方法必须由实现该接口的类提供。

class Animal {void speak() {print('Animal is making a sound');}
}class Dog implements Animal {void speak() {print('Dog barks');}
}

在上面的例子中,Dog 实现了 Animal 的接口,并且必须提供 speak 方法的实现。

Mixin

Mixin 是一种在 Dart 中实现代码复用的方式。它允许类在不继承的情况下获得其他类的功能。Mixin 使用 mixin 关键字定义,并通过 with 关键字使用。

mixin Swimmer {void swim() {print('Swimming');}
}class Human with Swimmer {}void main() {Human human = Human();human.swim();  // 输出: Swimming
}

Mixin 的主要作用是让类可以共享行为,而不必使用复杂的继承层次。

枚举类(Enum)

枚举enum)用于定义一组常量,常用于表示固定集合的值。Dart 中使用 enum 关键字定义枚举类型。

enum Weather { sunny, rainy, cloudy }void main() {var today = Weather.sunny;switch (today) {case Weather.sunny:print('It\'s a sunny day!');break;case Weather.rainy:print('It\'s raining!');break;case Weather.cloudy:print('It\'s cloudy!');break;}
}

在这个例子中,Weather 枚举类定义了三种天气情况,switch-case 语句可以根据不同的枚举值执行不同的逻辑。

类的继承

继承是面向对象编程的重要特性之一。在 Dart 中,类可以通过继承其他类来扩展或修改其行为。继承使用 extends 关键字实现。

class Animal {void sleep() {print('Sleeping');}
}class Dog extends Animal {void bark() {print('Barking');}
}void main() {Dog dog = Dog();dog.sleep();  // 输出: Sleepingdog.bark();   // 输出: Barking
}

Dog 类继承了 Animal 类,因此它可以访问 Animal 中的 sleep 方法。

抽象类

抽象类(Abstract Class)是不能被实例化的类,通常用于定义一组共同的行为,由子类具体实现。抽象类使用 abstract 关键字定义。

abstract class Shape {void draw();  // 抽象方法
}class Circle extends Shape {void draw() {print('Drawing a circle');}
}void main() {Circle circle = Circle();circle.draw();  // 输出: Drawing a circle
}

在这个例子中,Shape 是一个抽象类,子类 Circle 实现了 draw 方法。

总结

Dart 中的类为面向对象编程提供了强大的结构,支持属性、构造函数、方法、接口、Mixin 以及枚举类。通过类的继承、抽象类、接口和 Mixin,Dart 提供了丰富的机制来实现代码复用和模块化设计。理解这些概念是开发高效 Flutter 应用的基础。


http://www.ppmy.cn/devtools/128036.html

相关文章

quic-go源码二---server accept请求

本篇是上一篇的 看点2 内容。本该放上篇,但是由于上篇内容已经不少,所以单独拆开。另外还是主动说明下:我使用quic-go版本是github.com/quic-go/quic-go v0.47.0, 虽然我在上篇截图过程中就尽量带上了quic-go版本信息,…

【C语言】循环结构while循环do...while循环

while循环&#xff1a; 初始化循环变量 while(循环条件) {循环变量控制;循环体; }do while循环&#xff1a; do{循环变量控制;循环体; }while(循环条件)#include <stdio.h> #include <math.h> /* 功能&#xff1a;循环结构&#xff08;while,do while&#xff09…

在 Vue 3 中实现电子签名组件

在 Vue 3 中实现一个简单的电子签名组件&#xff0c;并解决一个常见问题&#xff1a;当签名组件放在弹窗内时&#xff0c;鼠标绘制会出现偏移的问题。 项目环境&#xff1a; Vue 3&#xff1a;前端框架Element Plus&#xff1a;UI 组件库 电子签名组件功能 画布绘制&#x…

判断 HTTP/2 多路复用是否在服务器上实现

要判断 HTTP/2 多路复用是否在服务器上实现&#xff0c;并确保浏览器正在使用多路复用来加载资源&#xff0c;您可以使用以下几种方法进行验证&#xff1a; 1. 使用浏览器开发者工具 大多数现代浏览器&#xff08;如 Chrome、Firefox、Edge&#xff09;提供了开发者工具&…

Python进阶

面向对象编程&#xff08;OOP&#xff09; 1.1 类和对象 类 是一个模板&#xff0c;用来描述一类对象的属性和行为。通过定义类&#xff0c;你可以创建对象&#xff08;也称为类的实例&#xff09;。对象 是类的实例&#xff0c;通过类创建的具体实例对象。 示例&#xff1a…

基于Springboot在线视频网站的设计与实现

基于Springboot视频网站的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https://do…

架构设计笔记-21-案例分析

1.遗留系统策略 / 数据迁移 / REST和RPC风格 2.分布式系统 / 分布式对象调用 3.开放式架构 / GOA 4.ESB 5.FMEA故障分析 6. 加密 / 公钥体系机制 / 加解密API和透明加密 7.嵌入式系统故障 / 故障滤波算法 / 容错算法 8.开源框架struts / spring / Hibenate 9.企业应用集成 10.T…

西门子嵌入式面试题及参考答案(万字长文)

RAM 和 ROM 的各种总线协议 RAM(随机存取存储器)和 ROM(只读存储器)在嵌入式系统中起着重要的作用,它们通常使用不同的总线协议与其他设备进行通信。 一、RAM 的常见总线协议 SRAM(静态随机存取存储器)常用的总线协议有异步 SRAM 协议和同步 SRAM 协议。 异步 SRAM 协议…