F-ES Sitecore
Animal a = new Dog();
Вы создаете две вещи, вы создаете объект (Dog) и ссылочную переменную (a). Объект-собака, он всегда будет собакой,и быть собакой-значит быть животным. Переменная, которую вы создаете, имеет тип Animal и указывает на животную часть объекта Dog. Поскольку объект "а" указывает на собаку, вы можете сделать это
Dog d = (Dog)a;
У вас по-прежнему есть только один объект (Dog), однако вы создали еще одну ссылочную переменную (d), которая указывает на собачью часть объекта. Итак, теперь у вас есть один объект (собака) и две опорные переменные, которые указывают на этот объект; "А", который смотрит на часть животного и может получить доступ только к свойствам и методам животного, и "d", который смотрит на часть собаки и может получить доступ к любому свойству или методу на части собаки или части животного (поскольку Собака наследует животное, Собака тоже считается животным).
А теперь подумайте вот о чем
Cat c = (Cat)a;
Будет ли это компилироваться? Да. Компилятор знает только, что "а" должно быть животным, поэтому вполне возможно, что это может быть кошка, но он не знает этого во время компиляции, поэтому дает вам преимущество сомнения. Однако во время выполнения он выдаст ошибку, так как нет" кошачьей "части объекта, на которую указывает" а", как" А " указывает на собаку.