代码之家  ›  专栏  ›  技术社区  ›  FlyingStreudel

泛型类的动态验证有哪些方法?

  •  1
  • FlyingStreudel  · 技术社区  · 14 年前

    所以基本上,这个题目听起来比实际的问题更离奇。

    我正在写一个申请,我想在其中实现一个成就制度。如果我的所有成就都是作为泛型类的实例创建的,那么我如何编写一个方法来验证这些成就(即,确定用户是否达到或超过了目标)当完成的专长类型可能不同,要满足的条件的数量可能不同,验证的类型可能不同时?

    成就-10000分!

    值(X)-10000
    条件-1
    验证-大于X

    与。

    成就-超碎片

    值(X)-10

    值(Y)-10秒
    条件-2
    验证-至少X小于Y

    我试图避免为每一项成就硬编码验证函数,因为它们主要是通用的,唯一的区别是如何验证它们。

    好像成就课看起来像

    public class Achievement 
    {
        boolean locked;
        String name;
        String desc;
    
        public Achievement(string n, string d)
        {
            //ctor code
        }
    }
    

    我正在尝试一种方法来做这件事,没有函数指针,我失败得很惨。另外,您甚至可以在java中使用函数指针吗?我不熟悉这门语言:(

    2 回复  |  直到 14 年前
        1
  •  2
  •   Mark Peters    14 年前

    我认为正确的方法是为每项成就制定一个验证方法:

    public abstract class Achievement {
        //...name, etc
        public boolean isSatisfied(Data byPlayerData);
    }
    

    但这并不妨碍您提供一些具体的实现,并使用参数对它们进行配置。

    public class ZombieKillingAchievement extends Achievement {
         private final int numKills;
         public ZombieKillingAchievement(String name, int numKills) {
             this.numKills = numKills;
         }
         public boolean isSatisfied(Data userData) {
             return userData.getZombieKills() >= numKills;
         }
    }
    
    //...
    registerAchievement(new ZombieKillingAchievement("Zombie Master", 100));
    registerAchievement(new ZombieKillingAchievement("Zombie Tamer", 50));
    
    //... on user data change
    for ( Achievement a : registeredAchievements ) {
        if ( a.isSatisfied() ) {
            //show congratulatory message
        }
    }
    

    编辑 strategy pattern .

    public class Achievement {
        //...name, etc
        private final AchievementValidator validator;
    }
    
    public interface AchievementValidator {
        public boolean isSatisfied(Data userData);
    }
    

    当与匿名内部类一起使用时,它几乎使用函数指针

    registerAchievement(new Achievement("Zombie Killer", new AchievementValidator() {
        public boolean isSatisfied(Data data) { return data.getZombieKills() >= 50; }
    });
    
        2
  •  1
  •   fortran    14 年前

    Java中的函数指针(通常在任何面向对象语言中)通常被多态对象所取代。