Interfaces, Pattern Observer
Bonjour a tous,
je suis en train de refondre un projet en essayant de le restructurer un peu, et au passage appliquait le fabuleux pattern observer.... mais voila, je m'oppose à un problème incompréhensible: mes interfaces ne semblent pas être reconnues, et je me confronte à des pointer exceptions.
Voici globalement mon observateur (en code simplifié pour faciliter la lecture)
[si jamais qqun souhaite le vrai code pour tenter de résoudre le problème, pas de soucis, je le mettrais]
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| class Oservateur {
function add ( interface IObjetObservable){
observerList.add (IObjetObservable)
}
function notify (eventType typeEvenement; event CeQuiCestPasse){
for i:=0 to observerList.count-1 do begin
if IObjetObservable (observerList.items[I]).observe (typeEvenement) then
IObjetObservable (observerList.items[I]).perform (CeQuiCestPasse);
enf
end
}
} |
Bon, globalement, j'ai des types d'événements et des observers par type d'événement.
Lorsqu'un événement est déclenché, tous les observeurs sont appelés avec en paramètre ce qui c'est passé.
Pour les observateur, je les fais implémenter l'interface IObjetObservateur.
Tout ce passe bien quand mon objet observateur est déclaré de la sorte:
Code:
class Objet = class (TInterfacedObject, IObjetObservateur)
Mais tout ce passe moins bien lorsque je décide qu'un TForm par exemple puisse observer:
Code:
class FormX = class (TForm, IObjetObservateur)
Dans le dernier cas, il semble que les méthodes d'implémentation de FormX ne soient jamais appelés...... :?
Dans le deboggeur, la ligne est "traversée", mais pas exécutée DANS l'observateur.
Bon, maintenant, le problème sous un autre angle:
Mon besoin est le suivant:
Je veux déclarer une interface qui soit implémentable par tous mes objets (quels qu'ils soient TForm, tout neuf, TCombo, ..., ...).
Une fonction capable de conserver une liste d'objets implémentant cette interface.
[prototype: procedure add (objetI : INomInterface)]
La possibilité de parcourir ces objets et de les manipuler via cette interface.....
[liste.items[X].appelFonctionDeLInterface (avec des paramètres);]
Merci de votre aide, je ne vois plus comment faire.
[je vois très bien en java, en python, en php, ..... mais en delphi...... j'arrive pas]