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