OriginalGriff
Когда вы бросаете что-то, вы ничего не "выбрасываете" из объекта, это на самом деле никак не меняет объект вообще. Все, что он делает, это меняет то, что вы можете сделать с ним в терминах вашего кода.
Подумайте на минуту о машинах.
У вас есть класс автомобиля:
public class Car
{
public int CountWheels { get { return 4; } }
}
И вы используете это для создания производного класса для каждого производителя:
public class Ford : Car
{
public bool MadeInGermany { get { return false;} }
}
public class MercedesBenz : Car
{
public bool MadeInAmerica { get { return false;} }
}
Вы можете управлять Фордом:
Car thatCar = new Ford();
Ford thisCar = (Ford) thatCar;
Console.WriteLine("{0}:{1}", thisCar.CountWheels, thisCar.MadeInGermany);
И кастинг ничего с ним не делает - он остается и автомобилем, и Фордом.
То, что вы не можете сделать, это бросить Мерседес в Форд:
Car thatCar = new MercedesBenz();
Ford thisCar = (Ford) thatCar;
Console.WriteLine("{0}:{1}", thisCar.CountWheels, thisCar.MadeInGermany);
И система сделает исключение, потому что "Форд" и "Мерседес" - это не одно и то же: вы не можете взять значок "Мерседеса", приклеить его к "Форду" и ожидать, что люди ему поверят! :смеяться:
Если у вас есть экземпляр базового класса в derivedInstance, прежде чем вы сделаете это:
derivedInstance = new Derived();
Затем система отбросит ссылку на этот экземпляр при загрузке нового значения - но она не изменит этот экземпляр. В вашем коде
Base derivedInstance = new Derived();
derivedInstance-это новая переменная, поэтому она все равно не содержала предыдущего экземпляра, строка, определяющая переменную, задает ее первое значение.