Java继承问题:超越vtable

时间:2011-04-13 12:01:22

标签: java serialization inheritance virtual client-server

这是场景:我有一个接口A,100个类B0 ... B99只实现A和50个类C0,C2 ... C98,它们扩展了B0,B2 ... B98。

B类使用MySQL数据库,在表上执行各种操作。 C类为B类添加额外的逻辑(验证,特权等)。 B类由工具生成,而C类由编码器编写。

客户端应用程序将使用B类,并且无法访问C类。当为B对象调用方法时,客户端将序列化该对象并将其与要调用的方法名称一起发送到服务器应用程序。

服务器将接收B对象并将其转换为A.但是,如果存在这样的类,则服务器希望执行在C类中重写的方法,否则执行B中的方法。正常行为只会从B执行方法。

如果没有将接收到的对象强制转换为C的巨大SWITCH语句,服务器如何能够做到这一点?

编辑:我是java新手,不知道反射可以做什么。在谷歌(thisthis)的帮助下,我解决了我的问题。我可以使用动态铸造来实现我想要的目标。感谢大家。

3 个答案:

答案 0 :(得分:2)

这种方法对我来说听起来很奇怪。为什么不直接提供命令(例如,定义命令名称的字符串)并为这些命令注册命令对象?然后你只需发送命令以及一些序列化参数。

编辑:

从你的描述来看,似乎C对象真的是B对象的装饰器。在这种情况下,他们不会从相应的B继承而是接受它的引用,然后服务器会查找传递给B的装饰器(例如,基于类或任何其他标识符),创建它们(或只是一个)传递B然后在装饰器上调用方法。

很像BufferedReader装饰任何Reader

答案 1 :(得分:2)

假设每个C类都有一个构造函数或一个静态createFromSuper来从它的父B(或从A)创建它......

您可以创建一个FactoryClass,其中注册了所有可用的C.您可以使用反射来获取要“替换”的C的父级,记住Map / Hashtable中的每个B.class-> C.class映射。

然后当你收到一个B时,你将它传递给Factory,它会在找到映射时返回相同的B对象,或者调用构造函数/ createFromSuper返回C.

答案 2 :(得分:1)

你有一个运行时类型为B的对象,并且你要求它调用它就像它是C类型的对象一样。这实际上并不是继承如何工作;你不能向下转换为C,除非它最初是作为C创建的,因为一般来说,它没有C的所有字段。

我猜你的C类不会向B添加任何其他字段(如果他们这样做,你的问题就没有意义)。既然他们没有添加任何额外的字段,那么我可以看到将它们视为C是如何有意义的,但是没有一个非常好的方法来实现它。我会说:

  1. 为什么首先有B和C?为什么不拥有B类,拥有所有权限等,并使用它?
  2. 如果不这样,我想你可以使用反射。编写一些通用代码,它接受任何B类对象,构造一个新的相应C对象,并复制所有字段。