Dart:面向对象、类相关知识点整理


前言

本篇是笔者关于Dart中类的相关知识进行整理

一、Dart中的面向对象

面向对象编程(OOP)的三个基本特征是:封装、继承、多态

  • 封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象。
  • 继承:面向对象编程(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类

构造函数

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(); // 间接的调用私有方法
}

Getter和Setter方法

在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模块化

在我们书写完成一个类后,如果要在其他.dart文件中进行复用,我们可以将类抽离出来,通过引入的方式对其进行模块化处理

例如上文的Person类,就可以被抽离成Person.dart文件

import 'Person.dart'
void main(){
    
    
 Person p1 = new Person();
 print(p1.name);
}

四、Dart类中的静态成员

定义静态成员

静态变量
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中,有四种操作符,如下

  • ? 条件运算符,一般用于非空判断
  • as 类型转换
  • is 类型判断
  • … 级联操作(连缀),最为重要

相关代码如下

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中的继承

Dart中类的继承如下

  • 子类使用extends 关键词来继承父类。
  • 子类会继承父类里面可见的属性和方法、但是不会继承构造函数。
  • 子类能复写父类的方法 getter 和 setter
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中面向对象部分的代码整理

猜你喜欢

转载自blog.csdn.net/qjyws/article/details/128816212