【问题标题】:Abstraction with variables带变量的抽象
【发布时间】:2015-04-04 22:18:46
【问题描述】:

所以我正在上高中在线 Java 课程,但是我的老师没有帮助... 所以我们正在学习抽象,我已经用我的“外星人”类移动了这个,他将通过切换两个图像来面对一个前进的方向和另一个倒退的方向......但是当他们在一个示例中显示代码时,它似乎过于复杂,我想知道我是否只是遗漏了一些东西。

我的代码

private String avatarRight = "Alien.png";
private String avatarLeft = "Alien1.png";
/**
  * Act - do whatever the Alien wants to do. This method is called   whenever
  * the 'Act' or 'Run' button gets pressed in the environment.
  */
public void act() 
 {
     movement(avatarRight, avatarLeft);
     gatherPart();
 }

(包含移动方法的超类)

/**
* Sets up the movement keys and facing for the Object
*/
public void movement(String avatarRight,String avatarLeft)
{
     if (atWorldEdge() == false)
      {
        if (Greenfoot.isKeyDown("w"))
         {
            setLocation(getX(), getY()-2);
         }
        if (Greenfoot.isKeyDown("d"))
         {
            setImage(avatarRight);
            setLocation(getX()+2, getY());
         }
        if (Greenfoot.isKeyDown("s"))
         {
            setLocation(getX(), getY()+2);
         }
        if (Greenfoot.isKeyDown("a"))
         {
            setImage(avatarLeft);
            setLocation(getX()-2, getY());
         }
      }
     else
      {
      }
}

他们的代码

{
    private GreenfootImage image1;
    private GreenfootImage image2;
    private boolean isKeyDown;
    private String key;
    private String sound;
    /**
    * Create a Duke and initialize his two images. Link Duke to a specific keyboard
    * key and sound.
    */
   public Duke(String keyName, String soundFile)
   {
        key = keyName;
        sound = soundFile
        image1 = new GreenfootImage("Duke.png")
        image3 = new GreenfootImage("duke2.png")
        setImage(image1);
    }

}

我只是说 avatarRight = "这张图片"

他们说 key = keyname

key = "key"

编辑: 所以设置它的方式和我最初设置的方式是

private int rotation;
public Capsule(int rot)
{
    rotation = rot
    setRotation(rotation);
}

但据我所知,下面的工作非常好。有什么理由我会做上面的代码而不是下面的代码

public Capsule(int rot)
{
    setRotation(rot);
}

【问题讨论】:

  • 您将构造函数与移动代码进行比较。我不清楚哪一部分过于复杂。我会说您的移动代码并不理想,因为您可以轻松地将特定移动绑定到特定键并避免所有检查,这就是“他们的”代码中的 cmets 似乎暗示他们正在计划的内容。
  • 好吧,既然如此。那么你将如何改进代码呢?这就是本课向我们展示的如何编写运动代码。
  • 那么别担心那部分。你能澄清一下你认为他们的更复杂的地方吗?那是一个构造函数,所以如果你要比较它们,似乎你必须比较相同的东西,例如构造函数、方法、变量等。我看到的主要是它们引用了图像和你没有。他们的会更好,因为每次设置图像时都必须获取文件;不是吗? IOW,他们setImage(image) 而你setImage(string)
  • 好吧,他们的代码使用了一个中间变量,他们有参数keyName,然后创建一个名为key的新变量,然后设置key = keyName,但为什么不直接设置keyName = "key" where "key " 是您将使用的键,例如 w。

标签: variables abstraction greenfoot


【解决方案1】:

好的,根据评论,我倾向于说你不是在比较相同的东西。

我只是说 avatarRight = "this image" 他们说 key = keyname key =“钥匙”

这似乎并不完全准确。你说的地方

private String avatarRight = "Alien.png";private String avatarLeft = "Alien1.png";

他们在构造函数中将 png 硬编码为 "Duke.png""duke2.png",顺便说一句,其中包含一个错误,因为据我所知,没有 image3

所以keyName 似乎不像你说的那样直接映射。也许您应该进一步研究代码以了解它们如何使用 key 或为两个示例提供相同的代码,以便我们进一步了解差异。

通过查看它,也许某处有一张地图,key 将用于访问特定的alien 或其他类型的游戏对象。


解决您的编辑问题。

有什么理由我会做上面的代码而不是那个 下面

无法通过该代码判断原因是否有价值;它似乎不是你所展示的。我可以告诉你,我这样做的原因是因为我在其他地方需要这种价值,但不是现在。这可能是出于多种原因。您必须查看所有可用的代码,看看他们是否曾在 anywhere 其他地方使用过该变量而没有将其传入。然后您就找到了原因或缺少的原因。

【讨论】:

  • 好的,我明白你的意思我试图将苹果与橙子进行比较。乍一看,代码似乎在做同样的事情,但事实并非如此。这就是为什么我很困惑谢谢你的澄清。
  • 这是一个小问题,并不完全相关,因此我将其删除。我将它添加到顶部...
  • 好的,谢谢,这很令人困惑,因为他们只有一小部分代码显示在 .PDF 的图片中,因此您无法查看全部内容....我是越来越不喜欢这门课了...再次感谢您的帮助,您对我学习Java的帮助很大!
  • 如果您对书籍的决定进行第二次猜测,请不要这样做。他们的 sn-ps 可能来自最终结果,因此他们知道您现在所做的更多,您可能不需要它。只要知道,当你做的时候,你只需重构(改变以反映新的要求)代码就能正常工作。如果我现在已经设法回答得更好,请随时重新接受它:) @power5000
  • @power5000,我想说虽然 sn-p 是一个盯着你的暗示。因此,虽然您现在可能不需要它或知道您为什么需要它,但他们认为他们需要它并且他们可能有充分的理由。
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2011-09-27
  • 2010-09-19
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多