将子类属性与parentclass方法一起使用

时间:2018-05-13 22:49:52

标签: java

好的,我很确定我在这里遗漏了一些东西,但这是我的问题: 我有一个抽象的父类,其中我有一个定义的(非抽象)方法,对所有子类都是相同的。问题是,它需要访问调用它的子类对象的属性。但它没有这样做,而是使用抽象类的(未定义的)属性。

我觉得有一个简单的解决方案,但我想不出来。

代码父母:

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

3 个答案:

答案 0 :(得分:3)

父类中的私有字段和子类中受保护的字段不应该是混淆的源。

如果可能,从子项中删除受保护的 fadeTriggered flagFade ,将getter和setter移动到父类(或者如果缺少则创建它们),你应该好。

为清洁起见,在访问这些字段时也要使用父类中的getter和setter。

答案 1 :(得分:1)

问题是您有fadeTriggeredflagFade两次,一次在父类中,一次在子类中。

现在,您的子类中可能有一些代码设置了fadeTriggeredflagFade,但从未对父fadeTriggeredflagFade执行任何操作,而父亲的checkFade方法会访问父级fadeTriggeredflagFade(永远不会被触及)。

要解决此问题,您需要删除子类中的重复成员,并设置父成员。

我建议将受保护的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
}