我有以下的情況,我想知道的CLR如何知道調用哪個方法:CLR如何知道哪個方法調用從抽象基類繼承的派生類?
public abstract class Shape
{
public abstract String PrintName();
}
public sealed class Square : Shape
{
public override String PrintName() { return "Square"; }
}
public sealed class Circle : Shape
{
public override String PrintName() { return "Circle"; }
}
於是我分別給出形狀:
Shape square = new Square();
Shape circle = new Circle();
List<Shape> shapes = new List<Shape> { square, circle };
foreach (Shape s in shapes)
{
Console.WriteLine(s.PrintName());
}
// Output:
// Square
// Circle
那麼是什麼讓我們可以調用方法派生類,即使我們正在調用基類型的方法?我很困惑這是如何處理的。
我不認爲編譯器的工作是尋找虛擬方法的實現。該工作在運行時完成。虛擬機負責該工作,而不是編譯器。即使你指的是JIT編譯器,它仍然不準確。編譯器只是檢查有問題的類型是否有相應的方法,並將剩餘的工作(動態查找)留給運行時。 –