如何更改swig生成的代理类中的特定方法实现?

时间:2016-09-01 07:51:46

标签: java c++ abstract-class swig

我正在尝试使用导演功能包装以下抽象类:

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 ++代码中的其他地方调用此事件时,会出现异常(因为它试图调用未实现的纯虚函数。

1 个答案:

答案 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()方法。