Dart 之消息、继承、多态

359 阅读3分钟

Dart之消息、继承、多态.png

前言

消息是沟通的桥梁,继承是智慧的传递,多态则是变化的魔法。今天,我们将一起深入探索Dart中的这些奇妙特性——消息、继承和多态。

一、消息

1.1、消息的定义

消息是对象之间进行通信的一种构造。 这种构造可以是一个指令,也可以是一个请求。一般是发送者对象发送一个指令或请求,接收者对象对这个请求进行处理。

在面向对象编程中,消息通常包含以下几个元素:

  • 发送者:发起消息的对象。它希望与另一个对象进行通信,以便执行某些操作或获取某些信息。
  • 接收者:接收消息的对象。它根据消息的内容执行相应的操作或返回信息。
  • 操作:消息中指定的操作或方法。这是接收者需要执行的具体任务。
  • 参数(可选):与消息一起传递的数据。这些参数提供了执行操作所需的信息或上下文。

1.2、消息传递

消息传递是对象间进行通信和协作的桥梁。

如何传递?

  1. 发送消息:发送者(对象)向接收者(对象)发送一个消息。
  2. 接收消息:接收者(对象)收到消息后确认消息是否接收,结果不通知发送者。
  3. 处理消息:接收者(对象)处理消息,处理结果不会通知发送者。
  4. 返回结果(可选):接收者返回一个处理结果(也可不返回)。

1.3、消息传递的优势

  • 解耦性:消息传递实现了对象间的解耦,使得对象可以独立地发生变化而不影响其他对象。
  • 灵活性:通过消息传递,对象能够动态地调用其他对象的方法,实现复杂逻辑与数据处理。
  • 可扩展性:当需要添加新功能或修改现有功能时,只需在相关对象中添加或修改相应的方法,并更新消息发送的逻辑即可,无需对整个系统进行大规模的修改。
  • 复用性:通过消息传递,相同或相似的功能可以在不同对象间共享,从而提高了代码的复用率。
  • 多态支持:消息传递支持运行时多态性(同一个消息可以在不同类型的对象上产生不同的行为)。

消息传递示例:

/// Receiver 类,用于接收消息
class Receiver {
  void receiveMessage(String message) {
    print("$message");
  }
}

/// Sender 类,用于发送消息
class Sender {
  void sendMessage(Receiver receiver,String message) {
    receiver.receiveMessage(message);
  }
}

void main() {
  Receiver receiver = Receiver();
  Sender sender = Sender();
  // 发送消息
  sender.sendMessage(receiver,"Hello,Dart!"); // 输出:Hello,Dart!
}

二、继承

2.1、继承的定义

继承是子类和父类共享数据和方法的一种机制。可以说是一种智慧的传递,如同父亲将其所拥有的财富(父类的数据或方法)传递给儿子。

注意: 子类一旦继承了父类,就拥有了父类的所有非私有的方法和属性。

2.2、继承的优势

  • 代码复用:子类复用父类的代码,减少重复,提高维护性。
  • 灵活性:子类在父类基础上添加或覆写方法,实现特定功能。
  • 结构层次化:继承建立清晰的类层次,便于理解和维护代码。
  • 多态性:支持父类引用指向子类对象,提高代码灵活性。

2.3、继承相关概念

继承类.png

  • 基类: 被继承的类。包含通用属性和方法,可以被其他类(派生类)继承。
  • 派生类: 从基类继承而来的类,它继承了基类非私有的属性和方法,并可以添加新的属性、方法或覆写基类的方法以实现特定的功能。
  • 继承层次: 由多个类组成的树状结构。

继承代码示例:

/// 定义一个Animal类
class Animal{
  String name;
  Animal(this.name);
  void roar(){
    print('The ${this.name} is roaring');
  }
}

/// 定义狗这个类,继承自Animal类
class Dog extends Animal{
  Dog(super.name); // 拥有Animal的属性name
  // 在继承的基础上重写父类的roar()方法
  @override
  void roar(){
    print('The ${super.name} is running!'); // 定制子类需要的内容
  }
}
void main() {
  Animal dog_a = Animal('dog');
  dog_a.roar(); // The dog is roaring
  Dog dog_b = Dog('dog');
  dog_b.roar(); // The dog is running!
}

三、多态

3.1、多态的定义

多态是变化的魔法,其在同一个接口下可以有不同的实现形式。可以理解为多态就是同一个接口,使用不同的实例而执行不同操作。如下图中的打印机一样,同一个接口传入不同的值得到不同的实例,不同的实例呈现出不同的结果(黑白、彩色)。

多态.png

3.2、多态的分类

  1. 编译时多态(方法重载):在同一个类中,允许存在多个同名但参数列表不同的方法。编译器在编译时根据方法签名确定调用哪个方法。
  2. 运行时多态(方法覆盖):子类重新定义父类中已经定义过的方法。当父类引用指向子类对象时,执行子类中重新定义的方法。

多态代码示例:

/// 定义一个Animal类
class Animal{
  String name;
  Animal(this.name);
  void roar(){
    print('The ${this.name} is roaring');
  }
}

/// 定义狗这个类继承自Animal类
class Dog extends Animal{
  Dog(super.name); // 拥有Animal的属性name
  // 在继承的基础上重写父类的roar()方法
  @override
  void roar(){
    print('${super.name} 汪汪'); // 定制子类需要的内容
  }
}
/// 定义猫这个类继承自Animal类
class Cat extends Animal{
  Cat(super.name); // 拥有Animal的属性name
  // 在继承的基础上重写父类的roar()方法
  @override
  void roar(){
    print('${super.name} 喵喵'); // 定制子类需要的内容
  }
}
void main() {
  List<Animal> animals = [Dog('小狗'),Cat('小猫')];
  for(var animal in animals){
    animal.roar();
  }
}
// 输出:
//小狗 汪汪
//小猫 喵喵

四、总结

消息作为沟通基石,促进了信息流通;继承承载智慧,实现了代码复用与扩展;多态如同变化魔法,让对象行为灵活多变。