SWTウィジェットの継承について
Swingと違ってSWTのウィジェットは
一部の例外を除き、基本的に継承不可となっているのですが
確かに、SWTのAPIドキュメントを眺めてみると
ウィジェット関係のクラスには、以下のような記述が大体書かれています。
IMPORTANT: This class is not intended to be subclassed.
IMPORTANT: This class is intended to be subclassed only within the SWT implementation.
実際、そのようなクラスを継承したクラスを作成してみても
コンパイルエラーにはなりません。
ただ、実行時に以下のようなエラーが表示されます。
org.eclipse.swt.SWTException: Subclassing not allowed
「継承は許可されていません」といった感じでしょうか。
で、このチェックを行っている箇所ですが
ウィジェットクラス内にcheckSubclass()という
以下のようなメソッドがあり、その中でチェックしているようです。
protected void checkSubclass () { if (!isValidSubclass ()) error (SWT.ERROR_INVALID_SUBCLASS); }
さらにいくつか辿って、チェックロジックが書かれている
Display#isValidClass(Class clazz)メソッドの中身を見てみます。
static boolean isValidClass (Class clazz) { String name = clazz.getName (); int index = name.lastIndexOf ('.'); return name.substring (0, index + 1).equals (PACKAGE_PREFIX); }
static final String PACKAGE_PREFIX = "org.eclipse.swt.widgets."; //$NON-NLS-1$
まあ、チェック自体はシンプルなもので
チェック対象クラスが「org.eclipse.swt.widgets」パッケージ内の
クラスかどうかのチェックをしているようです。
ちなみに、継承を許可している
CompositeやItemなんかでは
checkSubclass()メソッドは、以下のようになっています。
protected void checkSubclass () { /* Do nothing - Subclassing is allowed */ }
なので、どうしてもSWTのウィジェットを継承したい場合は
checkSubclass()メソッドを空でオーバーライドしてやれば
とりあえずはいけそうな感じですね。