Что такое "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. Теперь он ведет себя как настоящий ЖИВОТНЫЙ объект.

Другие вопросы по тегам