Próbuję ukryć implementację klasy, której nie mam. Chcę to zrobić, rozszerzając klasę i wdrażając własny interfejs. Oto, jak tworzona jest instancja klasy, której potrzebuję:Java OO: Czy to możliwe?
QueueInfo info = admin.getQueue(queueName);
KolejkaInfo jest klasą, której nie jestem właścicielem. Aby uzyskać wystąpienie tego obiektu, muszę użyć obiektu admin, aby go uzyskać. Chcę ukryć tę implementację, pracując za pośrednictwem interfejsu o nazwie IQueueInfo. IQueueInfo po prostu da dostęp do tego, czego konsumenci potrzebują od QueueInfo. Aby uzyskać ten QueueInfo, chciałbym pracować poprzez mój własny obiekt o nazwie EMSQueueInfo. Oto jak wyobrażam sobie ten konfigurowania:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
//...
}
Pozwala to moja konsument pracować chociaż interfejs IQueueInfo i pozwala bazowego EMSQueueInfo mieć dostęp do wszystkiego QueueInfo ma. Mój problem polega na uzyskaniu "żywej" instancji QueueInfo. Aby uzyskać regularne wystąpienie QueueInfo, mogę tylko powiedzieć:
QueueInfo info = new QueueInfo(queueName);
Ten przypadek nie jest „na żywo”, jak w nie został stworzony przez administratora obiektu. Robiąc to:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
public EMSQueueInfo(String queueName){
super(queueName);
}
}
nie daje mi obiektu "żywego". To, co chciałbym móc zrobić, to coś takiego:
public class EMSQueueInfo extends QueueInfo implements IQueueInfo {
public EMSQueueInfo(String queueName, Admin admin){
super = admin.getQueue(queueName);
}
}
Ale to niemożliwe.
Jedynym rozwiązaniem widzę jest usunięcie wystaje z mojej klasy EMSQueueInfo i po prostu owijania obiekt w górę siebie, uzyskanie dostępu do wszystkich metod za pośrednictwem prywatnej varialbe:
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();
}
}
To rozwiązanie działa , ale ja go nienawidzę. Czy ktoś może wymyślić lepszy sposób? Czy próbuję po prostu złamać OO i użyć go niewłaściwie? Ponownie, robię to wszystko, ponieważ chcę, aby konsumenci mogli pracować z IQueueInfo, w przyszłości IQueueInfo może być używany do uzyskiwania dostępu do implementacji JMS QueueInfo lub implementacji QueueInfo MSMQ. Każda pomoc byłaby niesamowita!
Byłbym nieufny wobec rozszerzenia klasy, którą próbujesz ukryć. Nie widzę problemu z kompozycją. –
Metody fabryczne Google – Bohemian
Opisałeś wzorzec 'Adapter': zawijasz coś, aby umożliwić dostęp tylko do niektórych jego części. Więc ** chcesz **, że queueInfo mają być ukryte. W przeciwnym razie ludzie będą mogli uzyskać dostęp do wszystkich pól na tym polu, a nie tylko do tych, które mają. –