2010-11-09 14 views
0

Je suis récemment revenu dans la programmation Java et suis actuellement coincé avec un certain problème.Java "étendant" un objet

J'ai un objet d'un certain type:

StandardClass stdClass = (StandardClass)request.getAttribute(ATTR); 

Mais maintenant, je dois faire l'objet StdClass un observateur de certains Observable.
Comme StandardClass n'implémente pas l'interface Observer, je ne peux pas l'ajouter directement en tant qu'observateur. donc j'ai essayé:

ExtendedClass extends StandardClass implements Observer { ... } 

Mais je n'ai pas été en mesure de trouver un moyen de jeter l'objet d'origine dans la nouvelle classe.

Peut-être que toute cette approche est totalement fausse et je ne peux actuellement pas voir la forêt pour les arbres, donc j'apprécierais toute contribution sur la façon de résoudre ce genre de problème.

Merci beaucoup d'avance pour votre temps et votre aide, j'apprécie vraiment !!

Cheers,
Thomas

+0

ne peut pas y ou make 'StandardClass' implémente' Observer'? –

Répondre

3

Vous ne serez pas en mesure de jeter l'objet d'origine dans un ExtendedClass, car il est pas une instance de cette classe. L'existence d'une sous-classe ne signifie pas que les instances de la superclasse peuvent être contraintes d'une manière ou d'une autre dans ces sous-classes. Dans ce cas, votre objet stdClass est une instance de StandardClass uniquement, il ne peut donc pas être converti avec succès.

EDIT pour clarifier: Bien sûr, certains objets stockés dans des variables StandardClass pourraient bien être des objets ExtendedClass. Ma compréhension était que vous n'avez pas modifié l'objet réel stocké dans la demande, simplement créé une sous-classe. Quand vous avez dit que vous ne pouviez pas effectuer la distribution, je suppose que vous voulez dire que la distribution a échoué à l'exécution avec un ClassCastException (certains rejets seront rejetés par le compilateur parce qu'ils ne peuvent pas réussir, par exemple un Integer ne peut jamais être converti en String, mais cela ne devrait pas être l'un de ces cas). Si vous avez créé la sous-classe et modifié votre application de sorte que l'objet stocké dans la demande ait été créé en tant qu'objet ExtendedClass, la conversion doit réussir.

Pour obtenir ce que vous voulez faire, une approche plus propre serait une sorte de wrapper class, qui contient une instance StandardClass et met en œuvre les méthodes Observer lui-même. Il peut ensuite appeler des méthodes appropriées sur StandardClass en réponse aux événements observés.

+0

Merci beaucoup pour votre contribution! En fait, j'avais déjà utilisé l'approche de la classe wrapper, mais le problème est que la classe StandardClass a une fonction de temporisation, auquel cas elle devrait notifier la classe wrapper de se désinscrire de l'observable. –

1

Si l'objet à request.getAttribute(ATTR) est vraiment un Observable, alors vous pouvez simplement jeté comme si:

Observable obs = (Observable) request.getAttribute(ATTR); 

Le compilateur ne vous permettra pas de jeter d'un type à un type incompatible, si elle sait que StandardClass n'est pas un Observable. Ou, vous pouvez simplement déclarer la référence comme ExtendedClass.

0

Avec votre approche:

request.getAttribute(ATTR); 

Faut-il de retourner un type d'objet de ExtendedClass afin de le jeter à un observateur par exemple:

Observer observer = (Observer) request.getAttribute(ATTR);