我正在尝试使用导演功能包装以下抽象类:
Listener.h:
class Listener {
protected:
void onEvent() = 0;
}
我的界面文件如下所示:
module(directors="1") Listener_Java
feature("director") Listener;
%{
#include "Listener.h"
%}
%include "Listener.h"
生成的Java代理类中的结果方法如下所示:
...
protected void onEvent() {
Listener_JavaJNI.Listener_onEvent();
}
我想要做的是生成没有正文的抽象方法,如下所示:
protected void onEvent();
有没有简单的方法可以做到这一点?我想使方法抽象的原因是强制任何派生类重写此方法,因为如果它没有被覆盖,当在我的c ++代码中的其他地方调用此事件时,会出现异常(因为它试图调用未实现的纯虚函数。
答案 0 :(得分:1)
来自SWIG documentation about Directors:
为什么代理类没有声明为抽象?为什么不是导演 代理类中的upcall方法声明为abstract?
声明代理类及其方法abstract会破坏JNI 参数编组和SWIG的下行调用功能(来自 Java to C ++。)创建一个继承自的Java抽象Java子类 启用导演的课程。使用前面的Foo类示例:
public abstract class UserVisibleFoo extends Foo { /** Make sure user overrides this method, it's where the upcall * happens. */ public abstract void method_upcall(Foo foo_object); /// Downcast from Foo to UserVisibleFoo public static UserVisibleFoo downcastUserVisibleFoo(Foo foo_object) { try { return (foo_object != null ? (FooDerived) Foo.downcastFoo(foo_object) : null); } catch (ClassCastException exc) { // Wasn't a FooDerived object, some other subclass of Foo return null; } } }
这并不妨碍用户创建派生自的子类 然而,Foo,UserVisibleFoo提供了提醒的安全网 user用来覆盖method_upcall()方法。