【问题标题】:Call all the same named methods in one line在一行中调用所有相同命名的方法
【发布时间】:2014-02-26 12:01:31
【问题描述】:

我想在我的游戏引擎(用 Java SE 编写)中制作“行为逻辑”之类的东西,但我没有制作,因此我不知道如何确保所有子类方法都被自动调用。它将与 Unity3D 的行为(如 Update()、Start()...)类似,但用于逻辑。在这里我提供实现它的尝试

public abstract class Behaviour {
     void Start(){}

     abstract void Update(){}

}

这个类被 DaturaBehaviour 类继承

public class DaturaBehaviour extends Behaviour{

public void AppInit()
{
    Start();
    System.out.println("foo");
}

public void AppRun()
{
    Update();
    OnGUI();
}

}

从那里我定义了将被调用的方法(例如在引擎初始化中的 AppInit 方法,在绘制的每一帧中的 AppRun)。

所以这些是这个系统的基础。我也做了一个测试类:

public class TestBehaviour extends DaturaBehaviour {

@Override
void Start()
{
    System.out.println("bar");//this isn't called dunno why
}

}

这是我第一次尝试使用 Java 制作游戏,所以请不要生气,如果这是显而易见的事情。谢谢!

【问题讨论】:

    标签: java game-engine lwjgl


    【解决方案1】:
    I don't know how to make sure that all the subclass methods are called automatically
    

    您必须知道自己调用了什么以及在方法中使用了哪些参数。在您的代码中,您必须手动编写要调用的方法和顺序。

    编辑:

    啊,我大概知道你在想什么。这是如何做到这一点的方式:

    private class Something {
        public void yeah() {
            System.out.println("");            
        }
    }
    
    private class Something2 extends Something{        
        @Override
        public void yeah(){
            super.yeah();
        }
    }
    

    EDIT2:好的,这只是猜测,但我认为您可能想要的是这个:

    private static abstract class Animal{
        abstract void sound();       
    }
    
    private static class Dog extends Animal{
        @Override
        void sound() {
            System.out.println("haf");
        }        
    }
    
    private static class Cow extends Animal{
        @Override
        void sound() {
            System.out.println("mooooo");
        }
    }
    
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();
        animals.add(new Dog());
        animals.add(new Cow());
        animals.add(new Dog());
        animals.add(new Dog());
        animals.add(new Dog());
        animals.add(new Cow());
        animals.add(new Cow());
        animals.add(new Cow());
        animals.add(new Dog());
        animals.add(new Cow());
        animals.add(new Dog());
        animals.add(new Dog());
        animals.add(new Cow());
        animals.add(new Dog());
        animals.add(new Cow());
        animals.add(new Dog());
        animals.add(new Dog());
    
        for (Animal animal : animals){
            animal.sound();
        }
    }
    

    输出:

    haf
    mooooo
    haf
    haf
    haf
    mooooo
    mooooo
    mooooo
    haf
    mooooo
    haf
    haf
    mooooo
    haf
    mooooo
    haf
    haf
    

    【讨论】:

    • 我知道,我想调用,因此您会看到 AppInit,它将(但不会)调用我计划覆盖的子类方法,不带参数。上面的例子不起作用的问题,我把它作为我想要做的洞察力,但不幸的是它失败了:(
    • 那么你必须更具体地说明你究竟想要达到什么目标,以及它在哪里没有按照你认为的那样工作。
    • 我试图调用例如 Start() 一次,所有子类都会自动调用 Start() 方法(但前提是它们重写了 Start() 方法)
    • 嗯,我想我明白了,检查了编辑的答案:)
    • 好吧,足够接近,但是在扩展类中我想定义该对象的行为并从超类调用,所以你的答案没问题,但我想要完全相反的:D(从某事调用是,这将触发子类是方法的自动调用)
    猜你喜欢
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多