我建議你更詳細地閱讀繼承和多態性。 (here和here)
在這個答案我試圖保持足夠簡單的概念。
Why is this statement allowed and is there a situation where this statement would be useful to a programmer?
但是爲了解釋你的問題有點讓我們來看看面向對象的程序需要使用多態性的簡單而經典的例子。
假設您正在編寫一個程序,需要存儲一些形狀並將其顯示在屏幕上。爲了達到這個目的,你需要在數組中存儲所有的形狀。對?
假設我們的類的類似:
class BaseShape
{
public virtual void Display()
{
Console.WriteLine("Displaying Base Class!");
}
}
class Circle : BaseShape
{
public override void Display()
{
Console.WriteLine("Displaying Circle Class!");
}
}
class Rectangle : BaseShape
{
public override void Display()
{
Console.WriteLine("Displaying Rectangle Class!");
}
}
而且你的陣列可以object
陣列。像這樣:
object[] shapes = new object[10];
在你的應用程序中,你需要編寫一個方法來顯示形狀。
一種解決方案可以迭代所有形狀並調用正確的形狀類型的方法。像這樣:
public static void DisplayShapes_BAD(){
foreach(var item in Shapes)
{
if(typeof(Circle) == item.GetType())
{
((Circle)item).Display();
}
if(typeof(Rectangle) == item.GetType())
{
((Circle)item).Display();
}
}
}
但是當另一種類型的Shape
出現在應用程序中時會發生什麼?基本上你需要修改DisplayShapes_BAD()
方法來支持新類型的Shape
(在方法體中增加新的if語句)
這樣你就打破了面向對象編程的Open/Closed principle。而且你的代碼不太可維護。
更好的方法來存儲形狀,以避免這種不好的方法是使用BaseShape
數組。像這樣:
public static List<BaseShape> Shapes = new List<BaseShape>();
這裏是如何項添加到形狀,這個名單:
Shapes.Add(new Circle());
Shapes.Add(new Rectangle());
現在來看看良好的執行DisplayShapes方法。
public static void DisplayShapes_GOOD()
{
foreach(var item in Shapes)
{
item.Display();
}
}
在上述方法中,我們呼籲項目類型的BaseShape
Display
方法。但是C#知道如何調用正確的方法(例如圓形顯示或矩形顯示)。這種機制是多態性的。
完整代碼共享爲Gist。
「爲什麼允許此語句」 - 因爲派生類的實例可以被視爲基類的一個實例。這是C#中多態性的基礎。 –
因此,它們僅在與虛擬方法(基類中)和覆蓋(派生類)中配對時纔有用? – user3083590
不是。只要你想表明所有的代碼只能使用基類成員操作,它們就很有用,所以選擇使用哪個派生類本地化到你實例化它的單個地方。 –