从子类返回值

时间:2015-07-31 14:37:29

标签: java

我希望能够以动态方式调用ObjectAction#firstClick,支持更多类。我的目标不是直接访问Test类并从那里调用它。

请记住,您可能不会使用静态上下文。

public abstract class ObjectAction implements AchievementListener {

    public abstract void firstClick(GameObject object);

}

firstClick是我想以动态方式调用的方式..

这是更多代码..

public interface AchievementListener {    
}

它充当监听器类型,它具有子类,例如ObjectActionItemActionGroundAction等。

这是枚举

public enum Achievements {
    TEST(new ObjectAction() {
        @Override
        public void firstClick(Object object) {

      }

    }); 

    private static final Set<Achievements> ACHIEVEMENTS = Collections.unmodifiableSet(
            EnumSet.allOf(Achievements.class));

    public static Optional<AchievementListener> getListener() {
        return ACHIEVEMENTS.stream().filter(a -> a.listener).findAny();
    }

    AchievementListener listener;

    Achievements(AchievementListener listener) {
        this.listener = listener;
    }
}

#getListener()函数是我需要帮助的部分,它没有工作atm,因为它不会返回一个AchievementListener,我正在寻找的东西就像getListener()。 getObjectActions()。firstClick(GameObject对象);对于像ItemActions这样的东西,它应该是getListener()。getItemActions()。executeAction(Item item);

1 个答案:

答案 0 :(得分:1)

您创建了一个不会声明任何方法的界面。然后在抽象类中实现该接口,该类只声明一个抽象方法;因此,您不需要那个抽象类,因为您没有使用必要的构造函数。 Read more on abstract classes and interfaces here

您需要做的是声明如下界面:

public interface AchievementListener {
    public void firstClick(GameObject object); // Declared the interface method
}

您现在可以离开抽象类,因为它没有用,直接要求AchievementListener

public class Test extends Achievement {
     @Override
     public AchievementListener process (Player player) {
         return new AchievementListener () {
             @Override
             public void firstClick(GameObject object) {
                 System.out.println("This works for sure ;)");
             }
         };
     }
}

简而言之,动态是在界面中,因为你想要在所有子类中使用一个方法!