06 Dart 基础 类和对象

本文介绍了Dart语言中的面向对象编程概念,包括封装、继承和多态。通过示例展示了如何创建类、实例化对象以及使用静态方法。此外,还探讨了Dart中的抽象类、多态性以及通过mixins实现类似多继承的功能。
摘要由CSDN通过智能技术生成

一 对象的基本概念

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

封装:封装是对象和类概念的主要特性。封装,把客观事物封装成抽象的类,并且把自己的部分属性和方法提供给其他对象调用, 而一部分属性和方法则隐藏。

继承:面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

多态:允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。

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

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

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

// 1 创建一个类
class Person {
  // 定义属性
  String name = "leonardo";
  // late 声明不为空的成员变量,如果不初始化的话需要在属性前面加上late
  late int age;
  // 默认的构造函数
  Person(this.name, this.age);
  // 定义方法
  void getInfo() {
    print("$name ---- $age");
  }
}

void main() {
  runApp(const MyApp());
  // 实例化一个类
  Person p = Person("Leonardo", 88);

  p.getInfo();
  // print(p.name);
}

二 静态方法和属性 Static 和 操作符

// 1 创建一个类
class Person {
  // 定义属性
  static String name = "leonardo from static";
  String nickName = "apple";
  // late 声明不为空的成员变量,如果不初始化的话需要在属性前面加上late
  late int age;
  late int sex;
  // 静态方法
  static getStaticInfo() {
    print(name);
    // print(nickName);访问报错
  }

  // 非静态方法
  void getInfo() {
    // 访问静态的方法
    getStaticInfo();
  }
}

void main() {
  runApp(const MyApp());
  // Person().getStaticInfo();

  Person p = Person();
  p.getInfo();

  //  类型判断
  if (p is Person) {
    print("is person correct");
  }

  // 级联操作服 ..
  // 可以让你在同一个对象上连续调用多个对象的变量或方法。
  p
    ..nickName = "apple"
    ..age = 1
    ..sex = 1;
}

三 类的继承

面向对象的三大特性:封装 、继承、多态

Dart中的类的继承:

1、子类使用extends关键词来继承父类

2、子类会继承父类里面可见的属性和方法 但是不会继承构造函数

3、子类能复写父类的方法 getter和setter

// 1 创建一个类
class Person {
  // 定义属性
  late String name = "leonardo from static";
  // late 声明不为空的成员变量,如果不初始化的话需要在属性前面加上late
  late int age;
  // 定义一个构造函数
  Person(this.name, this.age);
  void printInfo() {
    print("$name --- $age");
  }
}

// 类的继承
class Worker extends Person {
  String partment = "Human resource";
  // 父类实现构造函数 子类必须必须把参数传递给父类
  Worker(super.name, super.age);
  // 重写父类的方法
  @override
  void printInfo() {
    // TODO: implement printInfo
    print("worker --- $name --- $age");
  }
}

void main() {
  runApp(const MyApp());
  // Person().getStaticInfo();

  Worker w = Worker("LeonardoFibonacci", 32);
  w.printInfo();
}

四 抽象类

// 1 创建一个抽象类
abstract class Animal {
  // 定义抽象方法
  eat();
  run();
}

// 继承自抽象类的子类 必须实现抽象类中抽象方法
class Dog extends Animal {
  @override
  eat() {
    // TODO: implement eat
    print(" dog eat");
  }

  @override
  run() {
    // TODO: implement run
    print("dog run");
  }
}

class Cat extends Animal {
  @override
  eat() {
    // TODO: implement eat
    print(" cat eat");
  }

  @override
  run() {
    // TODO: implement run
    print(" cat run");
  }
}

void main() {
  runApp(const MyApp());
  // Person().getStaticInfo();

  // Animal 抽象类是没有办法直接被实例化的
  Dog d = new Dog();
  d.eat();
  d.run();
}

五 多态

允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。

子类的实例赋值给父类的引用。 多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。

六 implements实现多个接口

// 1 创建一个抽象类
abstract class A {
  // 定义抽象方法
  printA();
}

abstract class B {
  printB();
}

// 定义一个类实现A和B的接口
class C implements A, B {
  @override
  printA() {
    // TODO: implement printA
    print("AAAAAA");
  }

  @override
  printB() {
    // TODO: implement printB
    print("BBBBBB");
  }
}

void main() {
  runApp(const MyApp());
  // Person().getStaticInfo();

  // Animal 抽象类是没有办法直接被实例化的
  C c = new C();
  c.printA();
  c.printB();
}

七 mixins 类似实现多继承

mixins的中文意思是混入,就是在类中混入其他功能。

在Dart中可以使用mixins实现类似多继承的功能

因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Dart2.x中使用mixins的条件:

1、作为mixins的类只能继承自Object,不能继承其他类

2、作为mixins的类不能有构造函数

3、一个类可以mixins多个mixins类

4、mixins绝不是继承,也不是接口,而是一种全新的特性


// 特性1 就是 如果A 类 extends其他类,那么定义C类就会报错,不能mixins 其他类
class A {
  printA() {
    print("AAAAAA");
  }

  run() {
    print("A Run");
  }
}

class B {
  printB() {
    print("BBBBBB");
  }

  run() {
    print("B Run");
  }
}

// 使用with 关键字 mixins
class C with A, B {}

void main() {
  runApp(const MyApp());
  // Person().getStaticInfo();

  // Animal 抽象类是没有办法直接被实例化的
  C c = new C();
  c.printA();
  c.printB();
  // 打印结果B run,两个类中都有相同的方法时候 后面覆盖前面的
  c.run();
  // 以下打印结果全是true mixins的实例类型是什么?很简单,mixins的类型就是其超类的子类型。
  print(c is A);
  print(c is B);
  print(c is C);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值