Dart 中的多态教程
一、多态的概念
多态是面向对象编程中的一个重要概念。它允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果。换句话说,子类的实例可以赋值给父类的引用。多态的核心在于父类定义一个方法不去实现,让继承它的子类去实现,每个子类有不同的表现。
二、代码示例解析
(一)定义抽象类
abstract class Animal{eat(); //抽象方法
}
- 这里定义了一个抽象类
Animal
,它有一个抽象方法eat()
。抽象类不能被实例化,它的作用是为子类提供一个统一的接口规范。子类继承抽象类后,必须实现抽象类中的抽象方法。
(二)定义子类
class Dog extends Animal{eat() {print('小狗在吃骨头');}run(){print('run');}
}
class Cat extends Animal{eat() { print('小猫在吃老鼠');}run(){print('run');}
}
Dog
和Cat
都是继承自Animal
类的子类。- 在
Dog
类中,重写了eat()
方法,使其输出“小狗在吃骨头”,并且添加了一个run()
方法。 - 在
Cat
类中,重写了eat()
方法,使其输出“小猫在吃老鼠”,同样添加了一个run()
方法。
(三)多态的体现
main(){// Dog d=new Dog();// d.eat();// d.run();// Cat c=new Cat();// c.eat();Animal d=new Dog();d.eat();Animal c=new Cat();c.eat();}
- 在
main()
函数中,我们没有直接实例化Dog
和Cat
类,而是通过将它们赋值给父类Animal
类型的变量来体现多态。 Animal d=new Dog();
这行代码中,虽然变量d
的类型是Animal
,但它实际上指向的是一个Dog
类型的对象。当我们调用d.eat();
时,输出的是“小狗在吃骨头”,这是Dog
类中重写的eat()
方法的实现。- 同样,
Animal c=new Cat();
这行代码中,变量c
的类型是Animal
,但它指向的是一个Cat
类型的对象。调用c.eat();
时,输出的是“小猫在吃老鼠”,这是Cat
类中重写的eat()
方法的实现。
三、总结
通过这个例子,我们可以看到多态的强大之处。它允许我们使用父类类型的变量来引用子类类型的对象,并且能够根据实际引用的对象类型调用相应的方法。这种特性使得代码更加灵活和可扩展,可以方便地添加新的子类而不需要修改现有的代码逻辑。