- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个字典,其中一个字符串作为键,一个类作为值,它包含我在游戏中的“实体”列表。
private static Map<String, Class> entitiesList = new HashMap<String, Class>();
public static void initEntitiesList()
{
entitiesList.put("npc_something", NpcSomething.class);
entitiesList.put("npc_thing", NpcThing.class);
entitiesList.put("npc_stuff", NpcStuff.class);
...
}
这是一个示例层次结构。
Entity (abstract)
^
Mobile (abstract)
^
BaseCreature (abstract)
^
NpcSomething
-实体包含一个名为"public void Input(String args)"
的方法,可以在其他实体中重新定义。
- 当我在 NpcSomething 上调用 Input("x")
时,它应该执行一个从它自己的类到实体类的 super(arg)
链。
- 上面所有这些类都有一个允许字符串作为参数的构造函数。
我有一个独立的静态方法用于创建我的实体的新实例,它是这样的:
public static boolean createEntity(String entName, String args)
{
Class<?> entClass = null;
if ((entClass = entitiesList.get(entName)) != null)
{
Entity ent;
try
{
ent = (Entity)entClass.getDeclaredConstructor(String.class).newInstance("");
//this here failed.
//Method method = entClass.getMethod("input", new Class[] { ent.getClass() });
//method.invoke(ent, new Object[] {ent});
//java.lang.NoSuchMethodException: entities.NpcSomething.input(entities.NpcSomething)
//this here is really out of place, as i plan on having a hundred of entities and even more...
//if (entClass.isInstance(NpcSomething.class))
//i tried stuffs related to:
//T t = entClass.cast(ent);
//but i could not understand it at all even with documentation.
//basically i want to cast ent to entClass to call Input.
//right now, the line under calls Input on an Entity class, which is what i want to avoid.
ent.Input("Stuffs");
}
catch (InstantiationException ex) { ex.printStackTrace(); }
catch (IllegalAccessException ex) { ex.printStackTrace(); }
catch (IllegalArgumentException ex) { ex.printStackTrace(); }
catch (InvocationTargetException ex) { ex.printStackTrace(); }
catch (NoSuchMethodException ex) { ex.printStackTrace(); }
catch (SecurityException ex) { ex.printStackTrace(); }
}
}
我的问题。
EntCreator.createEntity("NpcSomething", "stuffs");
EntCreator.createEntity("NpcThing", "stuffs");
EntCreator.createEntity("NpcStuff", "stuffs");
我想在 NpcSomething 上调用 Input();
,
我想在 NpcThing 上调用 Input();
,
我想在 NpcStuff 上调用 Input();
。
然后这 3 个将调用它们各自的父类(super class)代码,依此类推,直到它们到达实体。
使用 "ent = (Entity)entClass.getDec..."
将它们转换为实体,因为我有 Mobile、Item 和其他继承 Input 的类。然后使用该实体,找到正确的子类,并调用该子类的输入。
短线问题:将“NpcSomething”创建为“实体”,然后将实体转换为“NpcSomething 的类”以调用方法“Input(args)”
。
快速问题的答案。
-问:为什么要这样做?
-A:创建带有预创建参数的实体,例如:创建一个("NpcSomething", "health 20 healthmax 25")
。
-Q:为什么不用instanceof?
-A:我在那个静态类中需要超过 200 个 instanceof
,这将是一个糟糕的编程习惯。
-Q:为什么不把输入法移到Entity本身?
-A:我有许多具有不同值(value)观的不同实体, 前任: NpcThing,唯一的飞行移动设备会有飞行速度,飞行能量...... ItemScroll,有文本,textColor,textFont ... 这些是我不能放在 Entity 中的东西,因为它需要 instanceof
,这对于 more than ents 来说是一种不好的做法。
-Q:你想把NpcSomething转换到Entity吗?
-A:再读一遍。
-Q:能否提供更多信息?
-A:我也愿意这样做。
-问:你为什么不把ent声明为NpcSomething?
-A:因为 ent 可能是 ItemStuff、ModelHouse 等,它们不是从 Mobile 或 BaseCreature 继承的...
我没有找到如何做我想做的好的实际例子。
我在文档中找不到任何特别针对此的内容。
欢迎任何帮助。
最佳答案
假设您从 newInstance()
方法中获得了 Entity ent
实例。这是您为该实例调用 input(String)
方法的方式:
// See here, the .class argument passed is the type of parameter
// You're using `ent.getClass()` here. It won't work
Method method = ent.getMethod("input", String.class);
// then while invoking this method, you pass the argument:
// Call `invoke()` method of `Method` class
// First arg is the instance on which this method should be called
// Remaining arg is the argument to be passed to the method itself.
result = method.invoke(ent, args);
关于java - 从动态转换的父类(super class)调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29653145/
我只想知道它们之间的区别: .class .class{ font-size:14px; } 对比: .class > .class{ font-size:14px; } 是一样的东西吗? 最佳答案
PrimeFaces 文档的以下摘录使标题中描述的两个选择器之间似乎存在差异: .ui-widget, .ui-widget .ui-widget { font-size: 90% !imp
我正在尝试选择特定值。但我遇到了一个问题。 我有两个元素,一个有 X Y,另一个有 X Y Z。 当选择 X Y Z 时,我也收到 X Y 的值...有没有办法让它寻找 X AND Y AND Z 而
.class.class 和 .class .class 有什么区别? 最佳答案 .class .class 匹配类 .class 的任何元素,这些元素是类 .class< 的另一个元素的后代/. .
我正在研究 Classname.class 和 Classname.class.toString() 并发现了一些不寻常的东西。 .class 在同一个类上运行时似乎等同于 .class。尽管 .cl
我试图在Dart中扩展列表并在此列表中使用另一个类。 这是我的示例,其中注释出了问题: import "Radio.dart"; // extends ListBase { List ra
我有一个很大的“经理”类,我认为它做得太多了,但我不确定如何将它划分为更多逻辑单元。 一般来说类主要由以下方法组成: class FooBarManager{ GetFooEntities();
我在一个文件中定义了一个抽象父类(super class),在另一个文件中定义了一个子类。我需要父类(super class)文件和堆栈跟踪报告来找到一个包含它。 但是,当它到达“extends”行时
我在 A. Alexenderscu 的现代 C++ 设计中找到了一些模板示例 作者使用以下行的地方 template class CheckingPolicy // class SmartPt
看一下这段代码: public static class A { public void doA() { } } public static class B extends A {
我有两个具有 .body 类的 div,但是,一个位于另一个具有 .box 类的 div 中 - 如下所示: 我只想为 .box 内部的 .body 设置样式...但我在下面所
我一定是遗漏了 C++ 规范中的某些内容,因为我无法解释为什么以下代码可以成功编译: class MyClass { static void fun(); }; int main() { MyClas
我正在尝试在 python 中“模拟”命名空间。我使用内部和外部类层次结构来创建我的命名空间。例如,您希望将文件(如资源)的路径保存在一个位置。我试过这样的事情: src = #path to sou
在试验 online crystal compiler 时(这太棒了),我遇到了一个我似乎无法找到解释的错误: class Person class Current < self end
在查看我的一段代码时,我陷入了如下的一条语句。 TMyObjectClass = TMyObject 类; 我有点困惑,不知道这句话是什么意思。由于 TMyObjectClass 在该语句上方没有声明
我正在编写一个简单的应用程序,以学习一些基本的Dart编程,但无法弄清楚其结构和包含的内容-我得到了一个重复的类Point 首先,我有一个叫做MouseTrack的主类。它将初始化列表并产生循环。 #
在 org.springframework.core.SerializableTypeWrapper (版本 5.2.3),第 112 行有以下代码: if (GraalDetector.in
我希望将鼠标悬停在子导航中的列表项上,以激活页面上该类别中所有项的类(不仅仅是父元素或同级元素)。有任何想法吗?这是我的意思的一个例子: img.BLUE {border:1px solid #FF
我正在通过 ClassLoader 加载类: Class clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).r
以下简化的类在从 get() 返回值时执行不同的操作,具体取决于该类是被赋予 double 值还是数组作为模板参数: #include "array" #include "type_traits" t
我是一名优秀的程序员,十分优秀!