我正在为面向对象编程类完成一项任务。我已经完成了所需的任务,所以在这一点上我们处理纯粹的好奇心(如果有任何道德困境在起作用)。
我定义了一个名为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”或“红色”)。
我如何进行这样的一般建筑?我应该提一下,我还没有涵盖多态性,因此不能使用该语言的这些功能。
答案 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();