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()
方法的實現。
三、總結
通過這個例子,我們可以看到多態的強大之處。它允許我們使用父類類型的變量來引用子類類型的對象,并且能夠根據實際引用的對象類型調用相應的方法。這種特性使得代碼更加靈活和可擴展,可以方便地添加新的子類而不需要修改現有的代碼邏輯。