Я хочу понять полиморфизм в С#, поэтому, попробовав несколько конструкций, я придумал следующий пример:
class Shape
{
public virtual void Draw()
{
Console.WriteLine("Shape.Draw()");
}
}
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Circle.Draw()");
}
}
Я понимаю, что для отправки сообщения Draw() нескольким связанным объектам, поэтому они могут действовать в соответствии со своей собственной реализацией. Я должен изменить экземпляр, к которому (в данном случае) форма "указывает" на:
Shape shape = new Circle();
shape.Draw(); //OK; This prints: Circle.Draw()
Но почему, когда я это делаю:
Circle circle = new Circle();
circle.Draw(); //OK; This prints: Circle.Draw()
Shape shape = circle as Shape; // or Shape shape = (Shape)circle;
shape.Draw();
Он печатает: "Circle.Draw()"
Почему он вызывает Circle.Draw() вместо Shape.Draw() после трансляции? Каковы причины этого?