Button01 - кнопка, когда вы пытаетесь привести кнопку к кнопке. Вы не можете преобразовать объект в производный объект, если объект не является производным объектом.Например, у вас есть базовый класс с именем Product, и он расширен за счет CartItem.
Теперь представьте, что у Product есть и другие производные классы, помимо CartItem, такие как PhoneItem и MailOrderItem.
Вы не можете сделать это: Product prod = new Product ();CartItem cart = (CartItem) prod.
Почему?
Поскольку «prod» не является элементом CartItem больше, чем PhoneItem и MailOrderItem.Вы создали его как элемент «Продукт», и он ВСЕГДА будет элементом «Продукт», независимо от того, как вы пытаетесь его разыграть.Вы можете заставить его быть MailItem или PhoneItem.
Однако, если вы сделали следующее, это сработало бы: CartItem cart = new CartItem ();Product prod = (Продукт) корзина;CartItem cart2 = (CartItem) prod;
Или
Product prod = new CartItem ();// (неявное приведение к продукту) CartItem cart2 = (CartItem) prod;
Почему это работает?Потому что CartItem также является продуктом (хотя не все продукты являются элементами корзины).Даже если вы добавили его в продукт, он все равно будет и всегда будет элементом CartItem.Единственное отличие состоит в том, что текущий дескриптор CartItem является дескриптором Product, предоставляя вам более ограниченный доступ ко всем функциям, которые может иметь ваш CartItem.Когда вы пытаетесь преобразовать его обратно из Product в CartItem, подсистема выполнения говорит: «Эй, могу ли я привести этот целевой объект к нужному типу?»В этот момент он смотрит на целевой объект и обнаруживает, что этот объект, хотя в настоящее время на него ссылаются как на Продукт, ДЕЙСТВИТЕЛЬНО является CartItem, который был отклонен.Следовательно, безопасно вернуть его обратно в CartItem, каким он был изначально.Еще раз, смысл в том, что после того, как вы создали его как CartItem, он ВСЕГДА является CartItem, независимо от того, сколько раз вы его повышали или понижали.Однако в приведенном вами примере ваш товар никогда не был чем-то большим, чем простой товар.Это никогда не был CartItem с самого начала, и его нельзя было кастовать.