Как мне создать объект производного класса в методе, аргумент которого является базовым классом в Java? - PullRequest
1 голос
/ 22 марта 2012

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

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

Рассмотрим следующий метод в AlienPack:

/**
 * Adds an Alien to AlienPack at the specified location 
 * @param newAlien An alien to add to the pack. Will be of type Red, Green, or Blue
 * @param index index must be within the bounds of the AlienPack array
 */
public void addAlien(Alien newAlien, int index)
{
    aliens[index] = newAlien;   
}

Этот метод, очевидно, небезопасен.

Чтобы массив «пришельцы» мог содержать всех трех типов пришельцев, параметр «newAlien» должен иметь тип «Чужой».К сожалению, это означает, что я не могу использовать конструктор копирования для написания безопасного кода (насколько я знаю).

Мое намерение таково: я хочу создать из newAlien независимую копию, которая содержит все те же данные, что и newAlien, но в которой явно не указывается тип Alien newAlien.Класс Alien и производные классы Red, Green и Blue имеют конструкторы копирования.Я также знаю, основываясь на экспериментах, что newAlien знает о своем типе (например, если я вызову метод наподобие «printType» для newAlien, он не напечатает «Alien», а вместо этого напечатает «Blue» или «Green»).или "Красный").

Как я могу выполнить такую ​​общую конструкцию?Я должен упомянуть, что я еще не рассмотрел полиморфизм и поэтому не могу использовать эти возможности языка.

1 Ответ

1 голос
/ 22 марта 2012

Добавить

public Alien clone();

к интерфейсу Alien и позвольте реализациям беспокоиться об этом. Э.Г.

public class Red implements Alien {

    @Override
    public Alien clone() {
        Red red = new Red();
        // Copy properties...
        return red; // Or just return new Red(this) with copy c'tor.
    }

}

Наконец, просто сделайте

aliens[index] = newAlien.clone();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...