首页 > 解决方案 > 将子类属性与父类方法一起使用

问题描述

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

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

代码父:

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);
        }
    }
}

代码子:

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

标签: java

解决方案


父类中的私有字段和子类中的受保护字段不应具有相同的字段,这会造成混淆。

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

并且为了清洁,在访问这些字段时,还要使用父类中的 getter 和 setter。


推荐阅读