繁体   English   中英

将多重继承C ++代码移植到Java

[英]Porting Multiple Inheritance C++ Code to Java

我创建了一个库,该库继承了另一个用C ++编写的库,现在我将该库移植到Java(C ++最初编写的原始库已经存在于Java中)。 在C ++代码中,有一个纯粹的虚拟类称为Stallable ,应该使用Stallable ,以便在给定电压输入增量的情况下向电动机控制器添加失速检测。 该类包含一个纯虚拟方法getVoltage() ,它是几种不同的电动机控制器类,用于提供电压源,还提供一些虚拟函数来确定是否存在失速。

类将继承该类以及原始库中的一个类(我无法访问该代码,并且出于所有意图和目的,否则将无法对其进行修改),并将实现getVoltage() ,并覆盖其他任何类他们可能喜欢的方法。 然后,可以仅询问这些对象是否存在停顿。

当我从Java的角度解决这个问题时,我的处境变得更加棘手。 我仍然无法接触原始类,因此无法重构代码,并且仍然允许我库的用户Stallable子类或实现Stallable但是他们认为合适。

目前,我看到的前景如下。

  1. 使Stallable为接口并重新实现其使用的失速检测逻辑。 为了创建C ++代码库具有的原始功能,我必须让类Stallable原始库并实现Stallable 这可以工作,但是需要在我要包含的任何子类以及最终用户要编写的任何子类中重新实现原始的纯虚拟C ++ Stallable的逻辑。
  2. 使Stallable为抽象类,该抽象类包含对原始库中的电动机控制器类的对象引用。 这保留了C ++代码中的某些功能,因此某些方法将必须被覆盖,而某些方法则可以选择性地被覆盖,但是此代码与C ++代码之间的透明度丢失了。 在C ++中,由于每个子类都是一个Stallable并且是原始马达控制器的派生类,因此在需要马达控制器和需要Stallable对象时,将指针轻松地指向该对象。 在这种情况下,必须实现某种类型的访问器函数,该函数将Java引用返回到每个Stallable子类将保留的原始电动机控制器。 透明度会丢失,但很容易添加停顿检测。

显然,如果我可以为各种电机控制器修改原始类,则此问题很容易是重构C ++代码的问题。

在研究了两种语言在OOP方面的差异之后,我倾向于选择选项2,尽管它给最终用户和计划包括的Stallable实现带来了Stallable 在开始编写Stallable.java之前,我一直在问是否还有其他更好的想法或见解。

因此,基本上,您想要的是lib的Java用户能够实现接口,并且行为会随之发生? 这听起来像是AOP(面向方面​​的编程)的工作。 使用AOP(例如,AspectJ),您可以将方法注入符合特定条件的类。

在您的情况下,标准是“实现Stallable接口”。 AOP的问题在于它是侵入性的。 如果您选择进行运行时编织,则用户将需要使用AOP编译其类或将AOP添加到其类路径中。

另一种选择是尝试使用动态代理进行一些委派。

最后,您可以尝试使用字节码操作http://asm.ow2.org/以便在运行时生成类。

如果您编写一个有关Java代码外观的示例,也许我的答案可能不太明确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM