SWTウィジェットの継承について

Swingと違ってSWTウィジェット
一部の例外を除き、基本的に継承不可となっているのですが
確かに、SWTAPIドキュメントを眺めてみると
ウィジェット関係のクラスには、以下のような記述が大体書かれています。

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()メソッドを空でオーバーライドしてやれば
とりあえずはいけそうな感じですね。