-2

次の設計要件があります。

  • interface Server {}
  • public class ServerImpl implements Server {}、シングルトンである必要があります
  • public class ServerABC extends ServerImpl {}
  • public class ServerXYZ extends ServerImpl {}

ここで、メソッドをクラスに入れたいのですが、Serverそれらの実装はまたはのいずれかで指定する必要がありServerABCますServerXYZ

ServerImpl

public class ServerImpl implements Server {
    private static Server server;

    public static synchronized RESTClient getInstance() {
        if (server == null) {
            server = new ServerImpl ();
        }
        return server;
    }
}

どうすればこれを機能させることができますか?

メソッドをServerインターフェイスに配置する場合、ServerImplそれを実装する必要がありますが、サブクラス(ServerABCおよびServerXYZ)に実装を提供する必要があります。これらのメソッドは、ServerImplオブジェクトを使用して呼び出す必要があります。

4

3 に答える 3

1

インターフェイスServerを抽象クラスにし、メソッドの前にabstractキーワードを付けます。次に、ServerImplこれらの抽象メソッドを実装します。

編集:

抽象ServerImplクラスを作成し、それらのメソッドの前にabstractキーワードを付けます。そして、これらの抽象的なメソッドを実装ServerABCします。ServerXYZ

于 2012-07-27T06:07:00.747 に答える
0

AbstractServerという名前の抽象クラスを作成します。必要なすべてのメソッドをこのクラスに入れ、ServerXYZとServerABCで拡張します。

于 2012-07-27T06:08:42.597 に答える
0

シングルトンパターンを回避するのが最善の方法だと思います。インスタンスが1つだけ必要な場合は、インスタンスを1つだけ作成します。シングルトンはテストをより困難にすることが知られており、実際には大きなメリットはありません。

あなたの状況で私がすることは次のとおりです。

  • インターフェイスを削除して、クラスServerImplを抽象クラスにします。サブクラスに実装する必要のあるすべてのメソッドも、抽象としてマークする必要があります。サブクラスの1つだけに特定のメソッドの実装を提供させたい場合があります。この場合、UnsupportedOperationExceptionそれを実装してはならないクラスにをスローするだけです。また
  • クラスを削除し、ServerImpl他の2つのクラスにインターフェイスを実装させるだけです。クラスServerImpl自体があまり実装されていない場合は、これがより良い方法です。
于 2012-07-27T06:20:32.483 に答える