我正在为面向对象的编程课分配作业。我已经完成了任务所需的工作,因此在这一点上,我们正在处理纯粹的好奇心(以防出现道德困境)。

我定义了一个名为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相同的所有数据,但是没有明确引用newAlien是什么类型的外星人。 Alien类以及Red,Green和Blue派生类都具有复制构造函数。根据实验,我还知道newAlien知道其类型(例如,如果我在newAlien上调用“ printType”之类的方法,它将不会打印“ Alien”,而是会打印“ Blue”或“ Green”或“红色”)。

如何进行这样的一般构造?我应该提一下,我还没有介绍多态性,因此不能使用语言的那些功能。

最佳答案



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

09-17 19:34