本篇是笔者关于Dart中类的相关知识进行整理
面向对象编程(OOP)的三个基本特征是:封装、继承、多态
Dart 所有的东西都是对象,所有的对象都是继承自Object类。
Dart是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是Object的子类。
一个类通常由属性和方法组成,下面展示Dart中类的Demo
class Person{
String name = "张三";
int age = 24;
void getInfo(){
print("${this.name} --- ${this.age}")
}
void setInfo(int age){
this.age = age;
}
}
void main(){
// 实例化
Person obj1 = new Person();
print(obj1.name);
obj1.getInfo();
obj1.setInfo(123);
}
Dart中有两种构造函数:
代码如下
class Person{
String name = "张三";
int age = 24;
// 构造函数 与类名同名
//Person(String name, int age){
//this.name = name;
//this.age = age;
//print("构造函数 实例化时触发");
//}
Person(this.name,this.age); // 简写
// 命名构造函数 可写多个
Person.now(){
print("我是命名构造函数");
}
}
void main(){
Person p1 = new Person("张三", 30);
Person p2 = new Person.now();
}
Dart 和 其他面向对象语言不一样, Dart中没有public private protected 这些访问修饰符号,但是可以使用_把一个属性或者方法定义成私有。
私有方法、私有属性必须单独抽离一个文件
例如下面的Animal.dart文件
class Animal{
String _name;
int age;
Animal(this._name, this.age);
void printInfo(){
print("${this._name} --- ${this.age}");
}
String getName(){
return this._name;
}
void _run(){
print("私有方法");
}
// 公有方法
execRun(){
this._run();
}
}
在另外一个Dart文件中进行引入
import "Animal.dart";
void main(){
Animal a = new Animal("小狗", 3);
print(a._name); // 访问不到
print(a.getName());
a.execRun(); // 间接的调用私有方法
}
在Dart中,获取属性除了走常规的公开方法进行获取,也可以走Getter和Setter方法进行获取
class Rect{
num height;
num width;
Rect(this.height, this.width);
set areaHeight(int value){
this.height = value;
}
get area{
return this.height * this.width;
}
}
void main(){
Rect r = new Rect(10, 4);
print(r.area); // 注意调用直接通过访问属性的方式访问area
r.areaHeight = 2;
print(r.area);
}
在Dart中,可以在构造函数体运行之前初始化实例变量
class Rect{
int height;
int width;
Rect():height = 2, width = 10{
print("${this.height}----${this.width}");
}
getArea(){
return this.height * this.width;
}
}
void main(){
Rect r = new Rect();
print(r.getArea());
}
在我们书写完成一个类后,如果要在其他.dart文件中进行复用,我们可以将类抽离出来,通过引入的方式对其进行模块化处理
例如上文的Person类,就可以被抽离成Person.dart文件
import 'Person.dart'
void main(){
Person p1 = new Person();
print(p1.name);
}
静态变量
Dart中,通过static关键字修饰静态属性、静态方法
class Person{
static String name = "张三";
static void show(){
print("${this.name}");
}
}
void main(){
//Person p = new Person();
//p.show();
// 静态属性和方法使用类名称访问
print(Person.name);
Person.show();
}
静态方法
非静态方法可以访问静态成员变量,但是静态方法不能访问非静态成员变量
class Person{
static String name = "张三";
int age = 20;
static void show(){
print("${this.name}");
}
void printInfo(){ // 非静态方法可以访问静态成员和非静态成员
print("${name}"); // 访问静态属性 直接使用属性名
print("${this.age}"); // 访问非静态属性
show(); // 直接调用静态方法不要写this
}
static void printUserInfo(){ //静态方法 没法访问非静态属性和方法
print(name); // 静态方法
show(); // 静态属性
}
}
void main(){
Person p = new Person();
p.printInfo();
}
在Dart中,有四种操作符,如下
相关代码如下
class Person{
String name;
int age ;
Person(this.name, this.age);
void printInfo(){
print("${this.name} ---- ${this.age}");
}
}
static void printUserInfo(){ //静态方法 没法访问非静态属性和方法
print(name); // 静态方法
show(); // 静态属性
}
}
void main(){
//Person p;
//p.printInfo();//空对象无法访问 如果要解决此问题 在点前面添加问号
//Person p = new Person("张三",123);
// ?
//p?.printInfo(); //如果对象空值的话 不会调用此方法
// is
//Person p = new Person("张三",123);
//if(p is Person){
//p.name = "李四";
//}
//print(p is Object);// true
//p.printInfo();
// as
//p1 = new Person("李四", 123);
//(p1 as Person).printInfo();
// ..
Person p1 = new Person("李四", 123);
p1.printInfo();
p1.name = "张三";
p1.age = 1111;
// 简化此赋值操作 连缀操作
p1..name="李四"
..age = 30
..printInfo();
}
Dart中类的继承如下
class Person{
String name = "张三";
int age = 123;
Person(this.name, this.age);
void printInfo(){
print("${this.name} ---- ${this.age}");
}
}
// 子类Web继承Person父类
class Web extends Person {
}
void main(){
Web w = new Web();
print(w.name); // 子类继承了父类的属性
w.printInfo(); // 子类继承了父类的方法
}
可以使用Super关键字来使用父类中的方法
class Person{
String name ;
num age;
Person(this.name, this.age);
//Person.xxx(this.name, this.age);
void printInfo(){
print("${this.name} ---- ${this.age}");
}
}
class Web extends Person{
String sex; // web 扩展自己的属性
Web(String name, num age, String sex):super(name, age){ // 实例化的时候给父类传参 通过使用super关键词
this.sex = sex;
}
/*
Web(String name, num age, String sex):super.xxx(name, age){ // 实例化的时候给父类传参 通过使用super关键词
this.sex = sex;
}
*/
// web扩展自己的方法
run(){
print("${this.name} -- ${this.age} -- ${this.sex}");
}
}
void main(){
Web w = new Web("张三", 123123, "男");
w.printInfo(); // 调用父类的方法
w.run(); // 调用子类的方法
}
dart中子类可以使用override关键字来对父类中的方法进行重写
class Person{
String name ;
num age;
Person(this.name, this.age);
void printInfo(){
print("${this.name} ---- ${this.age}");
}
void work(){
print("打游戏");
}
}
class Web extends Person{
Web(String name, num age):super(name, age){
}
run(){ // 子类的方法调用父类的方法 使用关键词super.方法名
print("run"); // 调用父类的方法
print("${this.name}"); //调用父类的属性
}
// 子类复写父类的方法 使用@override
//复写父类的方法时加上
void printInfo(){
print("姓名:${this.name} ---- 年龄:${this.age}");
}
work(){
print("写代码");
}
}
void main(){
Web w = new Web("李四",20);
w.printInfo(); // 姓名:李四 ---- 年龄:20
w.run();
}
以上是Dart中面向对象部分的代码整理