一种说“为我的项目中的所有子类扩展这个超类”的方式?

时间:2010-12-31 12:34:49

标签: java android

这些东西让我感到有点难过,但同样引起了我的兴趣。在我的Android游戏中,我有各种级别,可以扩展超类级别。我想要做的是构建一个levelDirectory(基于Singleton DP),它本质上是一个对象,其中包含一个存储所有Level子类的HashMap对象。这是我的问题:

我们都熟悉增强的for循环,但我怎样才能写出相当于

的东西
for(Level l : An Array Of Every Level Subclass In My Project that is an Extension of the Level Superclass){

HashMap.put(l.name, l);

}

我正在尝试构建一个可以在添加越来越多的级别子类时动态更新自身的系统。我知道在Level中有一个方法将自己提交给静态目录,并且在Level的构造函数中被调用是一个选项,但我只是想知道是否有一种方法可以在增强的for循环中执行上面所述的操作?

非常感谢

6 个答案:

答案 0 :(得分:2)

  1. 问题本身是错误的。您不能遍历List(“我的项目中的每个级别子类”)并获取Level的实例。我应该是班级。

  2. 从上下文来看,我认为你的意思是“每个Level子类的每个实例”。不,这是不可能的 - 虚拟机不是也不应该是数据库。您不仅可以查询对象,还必须管理代码中的引用(但您已经知道 - 您的构造函数解决方案将起作用)。

答案 1 :(得分:2)

选项1:

最近我不得不在JavaSE中解决类似的问题。我正在使用Google Reflections Library:

http://code.google.com/p/reflections/

但是我不确定它是否可以在Android上运行。我认为值得尝试一下,因为它很容易使用。在你的情况下,你会做类似的事情:

Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends Level>> subTypes = reflections.getSubTypesOf(Level.class);

这会给你一个Set(subTypes)来迭代并把它放在HashMap中。

选项2

您可以使用自定义注释来注释您的Level类,例如:

@Level public class MyCustomLevel {}

然后使用实现AbstractProcessor的自定义注释处理器在编译时处理注释。实现process方法以查找使用@Level注释注释的所有类。现在,您可以将找到的类的全名写入META-INF目录中的属性文件。从您的应用程序中,您可以阅读此属性文件并使用反射实例化类。

答案 2 :(得分:1)

如果您正在尝试动态获取在运行时扩展Level的所有类的列表,那实际上不可能,我担心。看一下这个主题:How do you find all subclasses of a given class in Java?

答案 3 :(得分:0)

不太了解Android,但听起来反思可能对此有所帮助,那么您对Java中的反射有何了解?

修改

不知道你必须限制自己加载水平。在这种情况下,您可能希望对每个实例进行跟踪,因为它的创建方式与您在问题中提出的非常相似。

我的想法是解析项目的所有目录,寻找子类 - 它可以在程序执行开始时完成一次,但它会列出可能永远不会被实例化的级别......

答案 4 :(得分:0)

我想你可能想让关卡成为一个界面,然后检查它是否是一个界面。

在最常见的形式中,接口是一组具有空体的相关方法。自行车的行为(如果指定为界面)可能如下所示:

interface Bicycle {

       void changeCadence(int newValue);   // wheel revolutions per minute

       void changeGear(int newValue);

       void speedUp(int increment);

       void applyBrakes(int decrement);
}

要实现此接口,您的类的名称将更改(例如,对于特定品牌的自行车,例如ACMEBicycle),并且您将在类声明中使用implements关键字:

class ACMEBicycle implements Bicycle {

   // remainder of this class implemented as before

}

实现接口允许类对其承诺提供的行为变得更加正式。接口在类和外部世界之间形成契约,并且该合同在构建时由编译器强制执行。如果您的类声称实现了一个接口,那么该接口定义的所有方法必须在其成功编译之前出现在其源代码中。

答案 5 :(得分:0)

我认为java的“精神”中的标准方式是服务提供者模式。

在“plugin”jar的META-INF / services中添加一个声明文件,并使用java.util.ServiceLoader(http://developer.android.com/reference/java/util/ServiceLoader.html)进行枚举你的提供者。