0

私はすでにこの質問にいくつかの関連コードを投稿しています: 返された配列リストのオブジェクト型を動的に指定します

さて、私の質問はもう少し具体的です。

実際、次の「ハンドラー」クラスを使用して、インターフェイスを実装するクラスのメソッドを呼び出していますIMSSQLStatement

public class MSSQLHandler {

    IMSSQLStatement statement;

    public MSSQLHandler(IMSSQLStatement statement) {
        this.statement = statement;
    }

    public void invoke() throws SQLException {
        statement.executeStatement();
    }

    public List<?> getDataList() throws SQLException {
        return statement.getDataList();
    }
}

問題は、実装されたクラスの作成されたオブジェクトを私 (または私のインターフェイスを実装する開発者) に強制的に配置する方法MSSQLHandlerです。

これは設計が悪いのかもしれませんが、問題に関する情報や使用例は見つかりませんでした。

4

1 に答える 1

1

はい、すべてのサブクラスで自動的に呼び出される明示的なコンストラクターで抽象クラスを使用できます。

public abstract class IMSSQLStatement {

    protected IMSSQLHandler handler;

    public IMSSQLStatement() {
        handler = new IMSSQLHandler(this);
    }
}

編集:(コメントを参照して)

ハンドラだけが のメソッドを呼び出せるようにする場合はIMSSQLStatement、両方のクラスを同じパッケージに配置する必要があります。修飾子を指定して、パッケージ プライベートおよびサブクラス アクセスのみを許可します。protectedメソッドはサブクラス自体で呼び出すことができますが、パッケージを除いて、外部からアクセスすることはできません。

これで問題が完全に解決するわけではありません。もう1つの(本当の偽の)方法はリフレクションです。

リフレクションを使用するには、サブクラスが使用する正確なメソッド シグネチャをドキュメントに記述し (もちろん、スーパークラスで抽象メソッドを定義しないでください)、private修飾子を指定する必要があります。ハンドラーは、リフレクションを通じてこれらのメソッドにアクセスする必要があります。

リフレクションの使用方法を説明しているドキュメントを参照してください。これは複雑で、SO の範囲を超えています。

于 2013-03-08T08:09:47.187 に答える