我是java新手,所以请原谅我的简单性。如何调用另一个对象中的一个对象,在本例中为GCompound。在下面的代码中,我想让“火焰”闪烁。但它似乎在run方法中不可见。
import java.awt.Color;
import acm.graphics.*;
import acm.program.*;
public class BuildTower extends GraphicsProgram {
GCompound Ekulobia;
GCompound Dike_na_fia;
GCompound Uli;
GCompound Aniche;
GCompound Achebe;
GCompound Akuwanta;
GCompound Ogbunike;
GCompound Obinohia;
GCompound Aguata;
private GCompound[] name = { Aguata, Ekulobia, Dike_na_fia, Uli, Aniche, Achebe, Akuwanta, Ogbunike, Obinohia } ;
public void run() {
setSize(800,300);
GLabel towerName;
for(int i = 0; i <= 8; i++ ) {
towerName = new GLabel (nameTower(i));
towerName.setFont("Times-12");
name[i] = new erectTower(towerName);
add(name[i],50 + i * 80,100);
}
for(int i = 0; i <= 8; i++ ) {
name[i].flame.setFilled(true); /*cannot access flame in erecttower method*/
pause (500);
name[i].flame.setFilled(false);
pause (700);
}
}
private String nameTower(int n) {
switch (n) {
case 0: return ("Aguata");
case 1: return ("Ekulobia");
case 2: return ("Dike na fia");
case 3: return ("Uli");
case 4: return ("Aniche");
case 5: return ("Achebe");
case 6: return ("Akuwanta");
case 7: return ("Ogbunike");
case 8: return ("Obinohia");
default: return null;
}
}
}-
package myprojets;
import java.awt.Color;
import acm.graphics.*;
public class erectTower extends GCompound {
private static final Color RED = null;
private GPolygon base;
private GRect mast;
public GPolygon flame;
public erectTower(GLabel towerName) {
base = creatBase();
mast = new GRect(4.42,63.94 );
flame = createFlame();
add(base, 0,95);
add(mast,5.29,20.44);
add(flame,5.29,20.44);
add(towerName, (base.getWidth() - towerName.getWidth())/2 , 115 );
}
private GPolygon creatBase() {
GPolygon poly1 = new GPolygon();
poly1.addVertex(0.0, 0.0);
poly1.addEdge(5.29,-10.62);
poly1.addEdge(4.42,0.0);
poly1.addEdge(5.29,10.62);
poly1.addEdge(-15,0.0);
return poly1;
}
private GPolygon createFlame() {
GPolygon poly2 = new GPolygon();
poly2.addVertex(0.0,0.0);
poly2.addEdge(-5.29,-10.44);
poly2.addEdge(5.60,4.85);
poly2.addEdge(1.90,-4.85);
poly2.addEdge(1.9,4.85);
poly2.addEdge(5.6,-4.85);
poly2.addEdge(-5.29,10.44);
poly2.addEdge(-4.42,0.0);
poly2.setColor(Color.RED);
return poly2;
}
}发布于 2013-10-15 16:47:02
您有一个GCompound数组,而不是您创建的扩展GCompound (erectTower)的类。
更改:
private GCompound[] name = { Aguata, Ekulobia, Dike_na_fia, Uli, Aniche, Achebe, Akuwanta, Ogbunike, Obinohia } ;至
private erectTower[] name = { Aguata, Ekulobia, Dike_na_fia, Uli, Aniche, Achebe, Akuwanta, Ogbunike, Obinohia } ;以及对GCompound的所有其他引用,这样您就可以使用自己的类。
发布于 2013-10-15 17:01:55
虽然@Michael是对的,但我试图更多地解释这一点。您的name数组的类型为GCompound。这意味着您通过name[i]访问的任何内容都具有静态类型GCompund。这意味着,即使运行时的动态类型为erectTower,您也只能访问GCompund的成员。让我们通过使用局部变量来更清楚地说明这一点:
GCompound foo = name[i]; // works
foo.flame.setFilled(true); // won't work because foo is GCompound
erectTower bar = name[i]; // won't work without cast because array is of type GCompound
bar.flame.setFilled(true); // would work if bar was correctly assigned before您可以按照@Michael的建议更改数组的类型,也可以强制转换您的变量。
erectTower bar = (erectTower)name[i]; // works as long as all objects in your array are of type erectTower. Else it would throw a ClassCastException
bar.flame.setFilled(true) // works您可能想要阅读有关polymorphism and static/dynamic type的内容。
https://stackoverflow.com/questions/19372769
复制相似问题