首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏设计中多态性、铸造和方法重写的Java实现

游戏设计中多态性、铸造和方法重写的Java实现
EN

Stack Overflow用户
提问于 2017-06-03 00:40:27
回答 1查看 93关注 0票数 2

注:这是我问题的概念性版本。我关于这些概念的应用的实际问题如下所示。

我试图找出一个对象何时被认为是它自己的类或类的超类的实例。考虑以下超类“动物”和“子类海马”:

代码语言:javascript
复制
import java.util.List;
import java.util.ArrayList;
public class Animal
{
    public static void main(String[] args)
    {
        Animal a= new Animal();
        /*1. This line prints a's class*/
        System.out.println(a.getClass());

        List<Animal> animals= new ArrayList<Animal>(1);
        animals.add(new Seahorse(1));
        //2. Let's see what happens here
        animals.get(0).printClass();

        for(Animal e : animals)
        {
            e.printClass(); //3 This is an overriden method
            //e.printThisClass(); Compile Time error;
            //4. Note this method only exists in subclass
        }
        Animal hiahiahia = new Seahorse();
        hiahiahia.printClass(); //5. Lets see what happens
        hiahiahia.printThisClass(); //6. 
    }
    public void printClass()
    {
    System.out.println("Animal");
    }
}
代码语言:javascript
复制
public class Seahorse extends Animal
{
    private int y;
    public Seahorse(int a)
    {
        this.y=a;
    }
    public void printClass()
    {
        System.out.println("Seahorse");
    }

    public void printThisClass()
    {
        System.out.println("Seahorse");
    }
}

输出结果如下:

代码语言:javascript
复制
class Animal  //1.
Seahorse      //2.
Seahorse      //3.
Seahorse      //5.

您可以看到,尽管Seahorse存储在动物对象或列表中,但多态性导致调用Seahorse。

但是,当我试图调用一个名称仅存在于Seahorse子类中的方法时,编译会抛出一个错误。

问:多态性只在方法覆盖时才有效,这是真的吗?有什么时候

代码语言:javascript
复制
 Animal animal = new Seahorse(1);

使动物只被视为动物(而不是海马)?

有什么区别

代码语言:javascript
复制
 Animal animal = new Seahorse();
 animal.printThisClass();

代码语言:javascript
复制
((Seahorse)animal).printThisClass();

最后,我应该什么时候使用铸造?

我正在进行一场2d游戏,并创建了以下课程:

代码语言:javascript
复制
public class Entity
{
}

代码语言:javascript
复制
public class Character extends Entity
{
  //With bunch of extra fields and methods
}

我还有一个控制器类,它有两个字段:

代码语言:javascript
复制
private List<Entity>;
private List<Character>;

我将它们分开,因为实体(在本例中是箭头、子弹)只与字符碰撞,而与其他实体不碰撞。问题是:我还有一个绘制我所有实体的BufferedImage的呈现方法。现在,为了使图形有意义,实体应该按照其Y值的升序呈现。(也就是说,从最远到最近)。但是,这需要将所有字符和实体放在同一个集合中.

问题是:我是否应该把它们分开?如果我把它们放在同一个列表中,这会不会引起混淆,因为你不能区分字符和实体?

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-03 01:43:47

对第一个问题的回答:

有什么区别 动物=新海马();animal.printThisClass();和 ((海马)动物).printThisClass()

没有什么不同。当你把那只动物丢给海马时,它允许你访问海马的方法。例如,如果Seahorse类有一个名为blowBubble()的方法,如果您执行了animal.blowBubble()(假设animal.blowBubble()是像上面那样定义的),那么它会给您一个错误,因为这个动物类没有一个名为blowBubble()的方法。

但是,当您通过执行((Seahorse)animal)将动物变量传递给Sea马时,您是在说我知道这个动物是一匹海马,所以请允许我使用西马的方法。

代码语言:javascript
复制
Animal animal = new Seahorse();
animal.method();
((Seahorse)animal).method(); // calls the exact same method even if it was overriden

但是,如果你这样做,你会注意到的

代码语言:javascript
复制
Animal animal = new Animal();
((Seahorse)animal).blowBubbles();
((Seahorse)animal).method();

每次你尝试施放它时,它都会抛给你一个ClassCastException,因为动物不能被转换成海马。但是,因为一匹海马总是和动物一样,你可以在一个海马实例上调用任何动物方法。

代码语言:javascript
复制
Seahorse seahorse = new Seahorse();
seahorse.methodInAnimalClass();

用于您的下一个问题,有两个单独的字符和实体列表完全取决于您。因为你需要做一个简单的排序算法来确定谁有最大的或最低的Y位置,这可能并不重要。

您可以始终创建一个名为getAllEntities()的方法,该方法返回一个新列表,该列表将实体和字符组合在一起,然后对该列表进行排序并呈现它们。

比如,评论说,您也应该查看接口,但我不建议创建大量的接口。我认为简单的开始是要走的路,然而,随着你的游戏变得先进,你可能会想要去实现它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44339171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档