好的,我很确定我在这里遗漏了一些东西,但这是我的问题: 我有一个抽象的父类,其中我有一个定义的(非抽象)方法,对所有子类都是相同的。问题是,它需要访问调用它的子类对象的属性。但它没有这样做,而是使用抽象类的(未定义的)属性。
我觉得有一个简单的解决方案,但我想不出来。
代码父母:
public abstract class Background
{
private boolean fadeTriggered;
private int flagFade;
public void checkFade(Background fadeFrom, Background fadeInto, SpriteBatch batch, ParallaxBackground parallaxBackground) {
//Clean up
if (fadeFrom.getFadeTriggered()) {
fadeFrom.setFadeTriggered(false);
if (fadeFrom.getFlagFade() > 0) {
fadeFrom.setFlagFade(0);
}
}
//Fade
if (!fadeTriggered) {
fadeTriggered = true;
flagFade = 1000;
}
if (flagFade > 0) {
parallaxBackground.draw(batch, this.getID(), 1);
parallaxBackground.draw(batch, fadeInto.getID(), flagFade * .001f);
flagFade--;
} else {
parallaxBackground.draw(batch, this.getID(), 1f);
}
}
}
Code Child:
public class BackgroundSnow extends Background {
private ArrayList<ParallaxTexture> textures;
private int textureCount;
private final String biomeName = "Default";
private final int id = 1;
protected boolean fadeTriggered = false;
protected int flagFade = 0;
public BackgroundSnow() {
int i = 1;
while (true) {
if (!Gdx.files.internal("backgrounds/parallax/" + biomeName + "/img" + i + ".png").exists()) {
this.textureCount = i - 1;
break;
}
i++;
}
Printer.debugPrintToConsole(ParallaxBackground.class, "Parallax Backgrounds found: " + Integer.toString(textureCount));
textures = new ArrayList<>();
for (int j = 1; j < textureCount + 1; j++) {
textures.add(new ParallaxTexture(j, biomeName));
}
}
}
然后用一些子类实例
调用checkFade答案 0 :(得分:3)
父类中的私有字段和子类中受保护的字段不应该是混淆的源。
如果可能,从子项中删除受保护的 fadeTriggered 和 flagFade ,将getter和setter移动到父类(或者如果缺少则创建它们),你应该好。
为清洁起见,在访问这些字段时也要使用父类中的getter和setter。
答案 1 :(得分:1)
问题是您有fadeTriggered
和flagFade
两次,一次在父类中,一次在子类中。
现在,您的子类中可能有一些代码设置了fadeTriggered
和flagFade
,但从未对父fadeTriggered
和flagFade
执行任何操作,而父亲的checkFade
方法会访问父级fadeTriggered
和flagFade
(永远不会被触及)。
要解决此问题,您需要删除子类中的重复成员,并设置父成员。
我建议将受保护的setter添加到父类:
protected setFadeTriggered(boolean fadeTriggered) {
this.fadeTriggered = fadeTriggered;
}
protected setFlagFade(boolean flagFade) {
this.flagFade = flagFade;
}
如果你有外部类设置这些值,则将它们公开。
答案 2 :(得分:1)
有几种方法可以解决这个问题。
一种方法是给你的抽象基类一个构造函数,强迫孩子们给它所需的值:
public abstract class Background {
private boolean fadeTriggered;
private int flagFade;
public Background(boolean fadeTriggered, int flagFade) {
this.fadeTriggered = fadeTriggered;
this.flagFade = flagFade;
}
// Now use your own copies of the fields as needed
}
另一种方法是要求子类为您感兴趣的字段定义getter方法:
public abstract class Background {
protected abstract boolean fadeTriggered();
protected abstract int flagFade();
// Call getters to access child values
}