Пытался написать комментарий, но он слишком длинный.
Эта строка:
Point x = new Point();
может быть разбита на три части:
- объявление переменной :
Point x
- назначение:
=
- создание объекта:
new Point()
Часть 3 (создание объекта) приводит к выделению памяти и инициализации экземпляра. Только часть 3 определяет, какой объект вы хотите выделить (new Point()
, new Circle()
, et c). Так как среда выполнения знает о типе, она может вычислить объем требуемой памяти.
Часть 1 (объявление переменной) просто сообщает остальной части кода, как он может получить доступ к вновь выделенному объекту, поэтому, типы слева и из право присвоения оператора =
может отличаться.
Если и Point
, и Circle
наследуют один и тот же базовый класс Drawing
, то в C# вы можете написать:
Drawing x = new Point();
Этот образец все еще выделяет точку из-за new Point()
, но остальная часть кода может использовать точку только как экземпляр базового класса, Drawing
, например:
x.Draw();
и не может использовать его как Point
без отливки:
x.x = 100; // compile time error