12. Dart中的对象类

目录
文章目录隐藏
  1. 一、类的声明与使用

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

  • 封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用,而一部分属性和方法则隐藏。
  • 继承:面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
  • 多态:允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果。

Dart 所有的东西都是对象,所有的对象都继承自 Object 类。

Dart 是一门使用类和单继承的面向对象语言,所有的对象都是类的实例,并且所有的类都是 Object 的子类

一个类通常由属性和方法组成。

一、类的声明与使用

1、声明一个 Person 类

class Person {
  // 类属性声明
  String name = "张三";
  int age = 23;
  //方法声明
  void getInfo() {
    //两种方式获取类属性
    // print("$name----$age"); //第一种
    print("${this.name}----${this.age}"); // 第二种
  }

  //修改类属性
  void setInfo(int age) {
    this.age = age;
  }
}

2、实例化 Person 类

void main() {
  //实例化
  var p1=new Person();
  print(p1.name);
  p1.getInfo();
}

实例化类的时候,也可以指定当前实例的类型,比如以前我们定义 list 的时候,可以这样写var list = new List();,然后通过 list.add()为集合里增加数据,我们这里在定义 list 的时候也可以为它指定List类型。同样我们实例化 Person 类的时候,也可以为它指定Person类型,如下代码:

void main() {
  //实例化
  Person p1 = new Person();
  // print(p1.name);
  p1.setInfo(28);
  p1.getInfo();
}

3、默认构造函数

class Person{
  String name;
  int age; 
  //默认构造函数
  Person(String name,int age){
      this.name=name;
      this.age=age;
  }
  void printInfo(){   
    print("${this.name}----${this.age}");
  }
}

默认构造函数的简写:

class Person{
  String name;
  int age; 
  //默认构造函数的简写
  Person(this.name,this.age);
  void printInfo(){   
    print("${this.name}----${this.age}");
  }
}

使用命名构造函数

void main() {
  Person p1=new Person('张三',20);
  p1.printInfo();

  Person p2=new Person('李四',25);
  p2.printInfo();
}

4、自定义类命名构造函数

命名构造函数允许多个不同名称构造函数的存在,调用不同名称的构造函数,可以实例化出不同的实例。

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

  Person.now() {
    print('我是命名构造函数');
  }

  Person.setInfo(String name, int age) {
    this.name = name;
    this.age = age;
  }

  void printInfo() {
    print("${this.name}----${this.age}");
  }
}

使用命名构造函数:

void main() {
  //实例化 DateTime 调用它的命名构造函数
  // var d=new DateTime.now();
  // print(d);

  //默认实例化类的时候调用的是 默认构造函数
  //Person p1=new Person('张三', 20);

  //命名构造函数
  //Person p1=new Person.now();   

  Person p1=new Person.setInfo('李四',30);
  p1.printInfo();
}

5、Dart 中单独把类抽成一个模块

在 lib/Person.dart 声明了一个 Person class:

class Person {
  // 类属性声明
  String name;
  int age;
  int sex;
  
  // 普通构造函数
  Person(String name, int age, [int sex = 1]) {
    this.name = name;
    this.age = age;
    this.sex = sex;
  }

  // 方法声明
  void getInfo() {
    print(
        'My name is ${name}, my age is ${age}, and I am a ${sex == 1 ? 'man' : 'woman'}');
  }

  // 修改类属性
 void changeName(String name) {
    if (name != null) {
      this.name = name;
    }
  }
}

上面的类已经声明结束了,属性、方法和构造函数都有。

类的引入

在要使用的 dart 文件中引入 Person 类:

import 'lib/Person.dart';

实例化 Person 类

Person p = new Person('mybj', 20, 0);
p.getInfo();
p.changeName('码云笔记');
p.getInfo();

6、私有属性及私有方法

Dart 和其他面向对象语言不一样,Data 中没有 public、private、protected 这些访问修饰符合,但是我们可以使用下划线_把一个属性或者方法定义成私有。

注:私有属性和方法 只有放在单独的文件 class 中生效

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();  //类里面方法的相互调用
  }
}

访问私有属性和方法:

import 'lib/Animal.dart';

void main() {
  Animal a = new Animal('小狗', 3);
  print(a.getName());
  a.execRun(); //间接的调用私有方法
}

7、Dart 类中的 getter 和 setter 修饰符的用法

getter 和 setter 可以最大程度的简化值得获取或者格式化以及设置。

class Rect{
  num height;
  num width; 
  
  Rect(this.height,this.width);
  get area{
    return this.height*this.width;
  }
  set areaHeight(value){
    this.height=value;
  }
}

使用 gettersetter

void main(){
  Rect r=new Rect(10,4);
  // print("面积:${r.area()}");   
  r.areaHeight=6;

  print(r.area);
}

8、初始化构造列表

Dart 中我们也可以在构造函数体运行之前初始化实例变量,不过单 class 上没有实际意义。

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()); 
}

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
码云笔记 » 12. Dart中的对象类

发表回复