Подтвердить что ты не робот

Передача объекта суперкласса в класс sub - down casting

Я знаю, что кастинг действительно может быть сделан только от подкласса к суперклассу (up casting), но этот пример иллюстрирует то, что я хотел бы сделать.

Class Super {}
Class Sub extends Super {}

Super super = new Super();
Sub sub = (Sub)super;

Я считаю, что это называется "down" литье, которое не разрешено так...

Каков наилучший способ создания объекта типа Sub, заданного объектом типа Super.

EDIT:

Что вопрос - Какой лучший способ превратить Animal в Cat.

Ответ? Начните с животного базового типа и скопируйте атрибуты кошке. Добавьте мех и хвост и т.д. В принципе создатель копии. Правильный ответ (или хороший ответ)?

ДРУГОЙ РЕДАКТИРОВАНИЕ:

Я думаю, что мой вопрос довольно ясен, но, возможно, он слишком общий. Просить "лучший" способ сделать что-то имеет тенденцию давать много разных ответов. Я понимаю, что лучший способ может быть другим в разных обстоятельствах.

Я не ищу учебник по основам Java или OO. Просто ловля мнениями, поэтому я могу решить эту проблему, поскольку я изложил ее, используя лучшие практики.

4b9b3361

Ответ 1

A Cat является Animal.

Если я дам вам животное (не обязательно быть кошкой), как бы вы превратили его в кошку?

EDIT:

Там есть способ сделать почти что угодно. Большую часть времени вы не должны. Я считаю, что лучший дизайн устранит необходимость в сокращении. Но вы можете:

  • имеет конструктор в Super, который принимает параметр Sub.

  • реализовать factory Super и иметь метод, который принимает параметр Sub.

Я предлагаю вам расширить свой вопрос, рассказать нам, что вам нужно, поскольку я действительно думаю, что существует более элегантное решение.

Ответ 2

Вы можете только опускать, если фактический объект имеет тип "Sub". Например:

Super subAsSuper = new Sub();
Sub sub = (Sub)subAsSuper

Ваш путь не будет работать, потому что super не является подклассом sub. Таким образом, вы получите ошибку Runtime.

Ответ 3

Вы можете добавить конструктор в класс Sub, который принимает объект Super в качестве параметра.

Ответ 4

ИЗМЕНИТЬ: Из вашего вопроса это совсем не ясно, что вы знаете и чего не знаете. Поэтому не удивляйтесь, когда люди отвечают на

Я считаю, что это называется "вниз", которое не допускается

а не (очень неопределенный) "фактический вопрос".

Да, конструктор копирования - это способ.

Нет, это не единственный метод factory.

Нет, это не самое лучшее - мы не знаем, какие ограничения и допущения у вас есть.


Старая версия: Кастинг может быть выполнен в любом случае, при этом повышение обычно не требуется (если вам не нужно выбирать определенный перегруженный метод).

Как правило, нет способа создать объект типа Sub, заданный объектом типа Super, кроме создания метода, который бы построил новый объект на основе данных из данного.

Чтобы выполнить бросок, вы должны быть уверены, что объект, который вы выполняете, на самом деле относится к типу, который вы использовали (или его подтипу).

Ответ 5

Возьмите эту идею в виду -

Class Super {}
Class Sub {
    public Super super = new Super();
}

Sub sub = new Sub();
sub.super = super;

Я сделал здесь очень простой пример, но вы можете пойти туда, где захотите, и сделать это так же, как наследование. и он не будет возвращать никаких ошибок.