多型的虛方法
概念:讓一個物件能夠表現出多種的狀態(類型)
實現多型的三種手段:
- 虛方法 virtual (virtual, override)
- 抽象類 abstract (abstract, override)
- 接口
抽象類
當父類中的方法不知道如何去實現的時候,可以考慮將父類寫成抽象類,將方法寫成抽象方法。
既然不能實現,就不要實現,就用抽象類,讓子類去實現。
抽象類&抽象方法是什麼意思?
- 叫的方法,不知道怎麼去實現,可以考慮用抽象類
- 抽象類是不允許有方法體的(沒有大括號)
什麼叫方法體,就是不能有大括號
抽象類(abstract)跟虛方法(virtual)區別在哪?
抽象類的父類,沒有實現方法
虛方法的父類,有實現方法的
1
2
3
4
5
6
7
//沒有方法體(沒有大括號)
public abstract void Test();
//這個叫做空實現(有大括號)
public void Test() {
//空實現
}
範例:狗狗會叫,貓咪也會叫
沒有現成的父類,因為狗狗跟貓咪都不能當做父類,所以用動物做為父類。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//叫的方法,不知道怎麼去實現,可以考慮用抽象類
//也就是說,既然不能實現,就用抽象類
//抽象類無法創建對象(物件),為什麼? 因為它沒方法,創建沒有意義
//Animal animal = new Animal();
Animal dog = new Dog(); //父類裡面裝的是子類對象
dog.Bark();
Cat cat = new Cat();
cat.Bark();
Console.ReadKey();
//父類
//叫的方法,不知道怎麼去實現,可以考慮用抽象類
public abstract class Animal
{
//抽象類是不允許有方法體的(沒有大括號)
public abstract void Bark();
}
//子類
public class Dog: Animal
{
public override void Bark() {
Console.WriteLine("狗狗汪叫!");
}
}
public class Cat : Animal {
public override void Bark() {
Console.WriteLine("貓咪喵喵叫");
}
}
什麼時候用虛方法、抽象類?
- 父類的函式有實現、有意義的時候,就用虛方法(virtual)
- 父類的函式不知道怎麼去實現,就用抽象類(abstract)