将多重继承C++代码移植到 Java
Porting Multiple Inheritance C++ Code to Java
我创建了一个库,该库扩展自另一个用C++编写的库,现在我正在将此库移植到Java(编写C++的原始库已经存在于Java中)。在C++代码中,有一个名为Stallable
的纯虚拟类,应该用于在给定电压输入增量的情况下向电机控制器添加失速检测。该类包含一个纯虚拟方法getVoltage()
用于提供电压源,因为它们是几个不同的电机控制器类,以及一些用于确定是否存在失速的虚函数。
以及原始库中的类(我无权访问代码,并且出于所有意图和目的无法修改),并将实现getVoltage()
,并覆盖他们可能喜欢的任何其他方法。然后可以询问这些对象是否有摊位。
当我从Java方面处理这个问题时,我的情况变得更加棘手。我仍然无法触及原始类,因此重构代码不是一种选择,并且我的库的用户仍应被允许以他们认为合适的方式进行子类化或实现Stallable
。
目前,我看到的前景如下。
- 使
Stallable
成为接口,并重新实现它使用的失速检测逻辑。为了创建C++代码库具有的原始功能,我必须让类对原始库进行子类化并实现Stallable
。这将起作用,但需要在我将包含的任何子类以及最终用户将编写的任何子类中重新实现原始纯虚拟C++Stallable
中的逻辑。 - 使
Stallable
成为一个抽象类,该类保存对原始库中电机控制器类的对象引用。这将保留C++代码中的某些功能,以便必须重写某些方法,而可以选择重写某些方法,但是此代码和C++代码之间会失去透明度。在C++中,由于每个子类都是原始电机控制器的Stallable
和派生,因此当需要电机控制器以及需要Stallable
对象时,很容易将指针扔到对象上。在这种情况下,必须实现某种类型的访问器函数,该函数返回对每个Stallable
子类将保留的原始电机控制器的 Java 引用。透明度会丢失,但很容易添加失速检测。
显然,如果我能修改各种电机控制器的原始类,这个问题很容易成为重构C++代码的问题。
在研究了两种语言的OOP方法之间的差异之后,我倾向于使用选项2,尽管它为我的最终用户和我计划包含的Stallable
实现增加了摩擦。在我开始写Stallable之前,我问是否有其他更好的想法或见解.java。
所以基本上你想要的是你的库的Java用户能够实现一个接口和行为将随之携带?这听起来像是AOP(面向方面编程)的工作。使用 AOP(例如 AspectJ),您可以将方法注入到与特定条件匹配的类中。
在您的情况下,标准是"实现可停的接口"。AOP的问题在于它是侵入性的。您的用户需要使用 AOP 编译其类,或者如果您选择使用运行时编织,则需要将 AOP 添加到其类路径中。
另一种选择是尝试使用动态代理进行一些委派。
最后,您可以尝试使用字节码操作 http://asm.ow2.org/以便在运行时生成类。
也许如果你写一个 Java 代码应该是什么样子的示例,我的答案可以不那么模糊。
- 尝试用java代码编译和运行c++代码
- 尝试在 QT 项目中调用 Java 代码时未找到类异常
- 使用 jni 将返回带有模板的对象的 Java 代码转换为 c++
- SWIG:如何处理生成的 Java 代码中的指针
- 使用 CMake 和 Maven 构建C++和 Java 代码,并捆绑在一个罐子里
- 无法将Android WebView渲染到C 和Java代码之间共享的外部纹理中
- 当我从java代码执行C++时不显示任何输出
- 从用户控制台获取输入 - Java 代码
- 使用大多数Java代码制作可执行文件,但可能添加了其他语言
- 从C++调用 java 代码:exception java.lang.NoSuchMethodError
- 是否可以从本机应用程序调用 Java 代码
- 从运行C++代码调用正在运行的 Java 代码,反之亦然
- 将 java 代码转换为 c++
- 是否可以从您的C++和Java代码进行OpenGL ES调用
- 简单的 Java 代码,在创建等效C++(私有静态成员和公共访问器方法)时遇到问题
- 无法用C++编写相同的 Java 代码"cannot initialize class member here"因为错误
- 如何使用QAndroidJniObject从Qt内部调用Java代码
- 将Java代码翻译成C++
- 如何使用Java代码中使用和返回.dll对象的函数
- 当我从Java代码执行C++程序时,我应该如何测量它的执行时间