我希望能够以动态方式调用ObjectAction#firstClick
,支持更多类。我的目标不是直接访问Test类并从那里调用它。
请记住,您可能不会使用静态上下文。
public abstract class ObjectAction implements AchievementListener {
public abstract void firstClick(GameObject object);
}
firstClick
是我想以动态方式调用的方式..
这是更多代码..
public interface AchievementListener {
}
它充当监听器类型,它具有子类,例如ObjectAction
,ItemAction
,GroundAction
等。
这是枚举
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);
答案 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 ;)");
}
};
}
}
简而言之,动态是在界面中,因为你想要在所有子类中使用一个方法!