0

我是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;   
    }
}
4

2 回答 2

1

您有一个GCompounds 数组,而不是您创建的扩展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-15T08:47:02.070 回答
0

虽然@Michael 是对的,但我尝试再解释一下。您的name数组是GCompound. 这意味着您访问name[i]的任何东西都具有静态类型GCompund。这意味着您只能访问 的成员GCompund,即使运行时的动态类型是erectTower. 让我们使用局部变量更清楚地说明这一点:

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

您可能想阅读多态性和静态/动态类型

于 2013-10-15T09:01:54.717 回答