【发布时间】:2014-09-27 10:36:04
【问题描述】:
目前我遇到了抽象类的问题。
有人告诉我我需要: “创建一个名为“Sprite”的抽象类,它存储(x,y)位置和对图像的引用。Sprite 类的构造函数应采用 2 个 int 参数(指定初始 x 和 y 位置),以及一个字符串,它是要从中加载图像的文件的名称,它应该加载图像(而不是加载图像的 Turtle 类)。它将需要一个 getter 函数来获取图像。在其中创建一个抽象方法你的 Sprite 类名为“public void update(Graphics g)”。这个函数应该没有主体。这样做的目的是确保从这个类继承的任何类都实现更新函数。"
我想我知道如何创建一个抽象类,就像我所做的那样。我也认为我在 Sprite 类的构造函数中的参数做得很好。但是,我从来没有在 Java 中加载过图像,我不确定如何扩展/实现抽象类函数。我所做的是否正确?以及如何从 Turtle 构造函数中调用该抽象类,以便正确设置变量? 修改了,还是有问题:
class Turtle extends Sprite
{
private int x;
private int y;
private static int dest_x;
private static int dest_y;
private String image;
// private Sprite sprite;
Turtle() {
// super();
super(x, y, image);
image = "turtle.png";
}
更新的 Sprite 类
import java.awt.Graphics;
import javax.imageio.ImageIO;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
public abstract class Sprite
{
int x;
int y;
String imageName;
Image image;
Sprite(){}
public Sprite(int x1, int y1, String im)
{
//Store variables
imageName = im;
x1 = x;
y1 = y;
try {
image = ImageIO.read(new File(imageName));
} catch (IOException ioe) {
System.out.println("Unable to load image file.");
}
}
public abstract void update(Graphics g);
public Image getImage()
{
return image;
}
}
以下是一些代码示例:
import java.awt.Graphics;
import java.awt.Image;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
class Turtle extends Sprite
{
private int x;
private int y;
private static int dest_x;
private static int dest_y;
private String image;
// private Sprite sprite;
Turtle() {
image = "turtle.png";
}
public int getX() { return x; }
public int getY() { return y; }
public void setX(int xIn) { x = xIn; }
public void setY(int yIn) { y = yIn; }
public void update(Graphics g) {
// Move the turtle
if (x < dest_x) {
x += 1;
} else if (x > dest_x) {
x -= 1;
}
if (y < dest_y) {
y += 1;
} else if (y > dest_y) {
y -= 1;
}
// Draw the turtle
g.drawImage(image, x, y, 100, 100, null);
}
import java.awt.Graphics;
import javax.imageio.ImageIO;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
public abstract class Sprite
{
int X;
int Y;
String image;
Image Image;
Sprite(){}
public Sprite(int x, int y, String im)
{
//Store variables
image = im;
X = x;
Y = y;
try {
Image = ImageIO.read(new File(image));
} catch (IOException ioe) {
System.out.println("Unable to load image file.");
}
}
【问题讨论】:
-
抽象的 Sprite 类通常看起来不错(考虑将变量从
Image命名为image,因为 Java 约定。您也不需要存储String图像),但是,image的 getter 方法丢失了。在您的Turtle类中,您使用super语句调用超类构造函数,在您的情况下为super(x, y, image)。由于这些变量(x、y、image)是在您的抽象类中定义的,因此您的子类中不需要它们。 -
谢谢!但我仍然感到困惑,因为它不允许我以这种方式调用超级构造函数。我将我的代码修改为这个,它告诉我:“在显式调用构造函数时不能引用实例字段 x”它正在为所有参数执行此操作。 :/ 我的更新代码在旧代码之上。
标签: java constructor abstract-class