Что такое "upcast"?
Я вижу, что термин "upcast" связан с ООП, но я не могу найти точное определение, выполнив поиск в Интернете.
Может ли кто-нибудь объяснить, что означает этот термин и в какой ситуации этот метод полезен?
2 ответа
Из описания тега вы разместили:
Обновление позволяет обрабатывать объект типа подкласса как объект любого типа суперкласса.
По сути, именно здесь вы приводите экземпляр подкласса к одному из его суперклассов, чтобы показать пример в псевдокоде.
class Base {
function say_hi() { printf("Hello From Base Class\n"); }
}
class Person extends Base {
function say_hi() { printf("Hello!"); } // Overridden. Java expects an @Override annotation
}
class Dog extends Base {
function say_hi() { printf("Woof!"); } // Again, overridden
}
Base B = new Base();
Base P = new Person(); // Implicit upcast
Dog dog = new Dog();
Base D = (Base)Dog(); // Explicit upcast
B.say_hi(); // Hello from base class
P.say_hi(); // Hello!
D.say_hi(); // Woof!
Есть множество случаев, когда это полезно. В общем, он определяет своего рода интерфейс, так что вы можете создавать подклассы, но все же использовать его в своем первоначальном контексте. Скажем, у вас есть игра, у вас будет вражеский объект. Это имеет некоторые общие функции, такие как текущее положение, скорость, здоровье и другие вещи. Несмотря на это, некоторые враги могут двигаться по-разному, могут играть другую анимацию кубика и, конечно, будут рисоваться по-разному. Проблема в том, что, поскольку они имеют одинаковый интерфейс, вам не нужно иметь специальный код для обработки всех типов врагов.
Было бы целесообразно создать базовый класс "Enemy" с этими полями и пустыми методами, но затем расширить его, чтобы иметь SmallEnemy, EvilEnemy, BossEnemy и т. Д. С их различными моделями и анимациями, заполняя пустые методы. Эти "пустые" методы также могут называться абстрактными или чистыми методами.
Upcasting - это механизм создания объектов, в котором мы создаем объекты, ссылаясь на их базовый класс. Мы делаем это путем замены подкласса базовым классом в определении объекта. Это особенно удобно, когда вы знаете, что созданный специализированный объект не обязательно будет использовать все функции, которые он может предложить. Итак, замените подкласс (унаследованный класс) базовым классом, и все, что вы сделали, это Upcasting.
Эта концепция может быть хорошо понята, если мы возьмем пример. Предположим, у нас есть три класса. Один родительский или обобщенный класс называется классом LIVING_THINGS и двумя подклассами ANIMAL и BIRD, которые наследуются от первого. Родительский класс или базовый класс имеет функции, скажем, Born() и Die(). Специализированный класс имеет функцию, скажем, Run() и Fly() для животных и птиц соответственно.
Для создания объекта ANIMAL и BIRD вы обычно используете следующий синтаксис:
ANIMAL animal = new ANIMAL();
BIRD bird = new BIRD();
В приведенном выше коде методы Run() и Fly() отлично работают с созданными объектами. Это нормальный способ создания объектов. Ссылка, используемая для создания объекта, в точности совпадает с типом объекта, созданного во время выполнения. Методы подкласса работают просто отлично.
Но для создания Upcast вы должны использовать следующий синтаксис:
LIVING_THINGS animal = new ANIMAL();
В приведенном выше коде, даже несмотря на то, что мы создали объект типа ANIMAL и BIRD, используемая ссылка фактически относится к базовому классу. Поэтому методы Run() и Fly() не доступны для этих объектов. Вместо этого доступны только функции, доступные в базовом классе, такие как Born() и Die(). Это может быть полезно, если вы хотите, чтобы в начале были доступны только базовые функции, и хотите позднее преобразовать эти объекты в их оригинальные типы, чтобы впоследствии сделать их специализированными функциями доступными. Это можно сделать с помощью Downcasting. Даункастинг может изменить ссылочные типы этих объектов на специализированный подкласс, чтобы сделать доступными функции, которые были бы недоступны в противном случае. Посмотрите код ниже:
ANIMAL new_animal = animal as ANIMAL;
В приведенном выше коде мы создали новый объект и преобразовали его в тип ANIMAL. Рекомендуется проверять, поддерживает ли конвертируемый объект преобразование. Это можно сделать с помощью ключевого слова is.
if (animal is ANIMAL)
{
ANIMAL new_animal = animal as ANIMAL;
new_animal.Run();
}
С помощью Downcasting мы восстановили все функции и свойства, которые должен иметь объект ANIMAL. Теперь он ведет себя как настоящий ЖИВОТНЫЙ объект.