나는 소유하지 않은 클래스의 구현을 숨기려고합니다. 나는 이것을 확장하고 클래스를 확장하고 내 인터페이스를 구현하려고한다. 다음은 필요한 클래스의 인스턴스가 생성되는 방법입니다.Java OO : 이것도 가능합니까?
QueueInfo info = admin.getQueue(queueName);
QueueInfo는 내가 소유하지 않은 클래스입니다. 이 객체의 인스턴스를 가져 오려면 admin 객체를 사용해야합니다. IQueueInfo라는 인터페이스를 통해이 구현을 숨기고 싶습니다. IQueueInfo는 단지 QueueInfo에서 소비자가 필요로하는 것에 대한 액세스를 제공합니다. 따라서이 QueueInfo를 얻으려면 EMSQueueInfo라는 자체 객체를 통해 작업하고 싶습니다. 이건 내 소비자가 인터페이스 IQueueInfo 불구하고 작업 할 수 있습니다
public class EMSQueueInfo extends QueueInfo implements 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);
}
}
하지만 불가능합니다.
나는 개인 varialbe를 통해 모든 메소드에 대한 액세스 권한을 얻기는 내 EMSQueueInfo 클래스에서 확장 제거하고 단지 자신을 위로 객체를 포장되어보고 있어요 유일한 해결책 :
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 구현에 액세스 할 수 있습니다. 어떤 도움이 굉장 할 것입니다!
숨기려고하는 클래스를 확장하는 데주의해야합니다. 나는 구성에 문제가 보이지 않는다. –
Google factory 메쏘드 – Bohemian
당신은 'Adapter' 패턴을 묘사했습니다 : 당신은 무언가를 감싸서 그것의 특정 부분에만 접근을 허용합니다. 따라서 ** queueInfo를 숨기고 싶습니다. 그렇지 않으면 사람들이 원하는 필드뿐만 아니라 모든 필드에 액세스 할 수 있습니다. –