所有していないクラスの実装を非表示にしようとしています。これを実行して、クラスを拡張し、独自のインターフェイスを実装したいと思います。必要なクラスのインスタンスを作成する方法は次のとおりです。
QueueInfo info = admin.getQueue(queueName);
QueueInfoは私が所有していないクラスです。このオブジェクトのインスタンスを取得するには、adminオブジェクトを使用して取得する必要があります。IQueueInfoと呼ばれるインターフェイスを介して作業することにより、この実装を非表示にしたいと考えています。IQueueInfoは、消費者がQueueInfoから必要とするものへのアクセスを提供するだけです。したがって、このQueueInfoを取得するには、EMSQueueInfoと呼ばれる独自のオブジェクトを使用して作業します。これが私がこれを設定することをどのように想像するかです:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
//...
}
これにより、コンシューマーはインターフェイスIQueueInfoを介して作業できるようになり、基盤となるEMSQueueInfoがQueueInfoのすべてにアクセスできるようになります。私の問題は、QueueInfoの「ライブ」インスタンスを取得することにあります。QueueInfoの通常のインスタンスを取得するには、次のように言うことができます。
QueueInfo info = new QueueInfo(queueName);
このインスタンスは、管理オブジェクトによって作成されていないため、「ライブ」ではありません。だから、これを行う:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
public EMSQueueInfo(String queueName){
super(queueName);
}
}
「ライブ」オブジェクトは提供されません。私ができることを望んでいるのは、次のようなものです。
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
public EMSQueueInfo(String queueName, Admin admin){
super = admin.getQueue(queueName);
}
}
しかし、それは不可能です。
私が見ている唯一の解決策は、EMSQueueInfoクラスからextendsを削除し、オブジェクトを自分でラップして、プライベート変数を介してすべてのメソッドにアクセスすることです。
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
private QueueInfo _queueInfo
public EMSQueueInfo(String queueName, Admin admin){
_queueInfo = admin.getQueue(queueName);
}
public int getMessagesOnQueue() {
return _queueInfo.getMessagesOnQueue();
}
}
その解決策は機能しますが、私はそれが嫌いです。誰かがより良い方法を考えることができますか?OOを壊して誤用しようとしているだけですか?繰り返しになりますが、コンシューマーがIQueueInfoを使用できるようにしたいので、これらすべてを実行しているだけです。将来的には、IQueueInfoを使用してQueueInfoのJMS実装またはQueueInfoのMSMQ実装にアクセスできるようになる可能性があります。どんな助けでも素晴らしいでしょう!