如何在一个方法中构造一个派生类的对象,该方法的参数是Java中的基类?

时间:2012-03-22 04:29:35

标签: java inheritance copy-constructor

我正在为面向对象编程类完成一项任务。我已经完成了所需的任务,所以在这一点上我们处理纯粹的好奇心(如果有任何道德困境在起作用)。

我定义了一个名为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”必须是Alien类型。不幸的是,这意味着我不能使用复制构造函数来编写安全代码(据我所知)。

我的意图是这样的:我希望从newAlien构建一个独立的副本,它具有与newAlien相同的所有数据,但没有明确地引用Alien newAlien的类型。 Alien类和Red,Green和Blue派生类都有复制构造函数。我也知道,根据实验,newAlien知道它的类型(例如,如果我在newAlien上调用类似“printType”的方法,它将不会打印“Alien”,而是打印“Blue”或“Green”或“红色”)。

我如何进行这样的一般建筑?我应该提一下,我还没有涵盖多态性,因此不能使用该语言的这些功能。

1 个答案:

答案 0 :(得分:1)

添加

public Alien clone();

Alien接口,让实现担心这个问题。 E.g。

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();