Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Más problema padrón observador (https://www.clubdelphi.com/foros/showthread.php?t=29509)

adpa 24-01-2006 12:20:17

Más problema padrón observador
 
Hola:
Tengo el siguiente sujeto y observador declarado.
Código Delphi [-]
type
TObserver  = CLASS
   public
    procedure Update(const Subject: TObject); virtual; abstract;
  end;
  TSubject = class
  private
    fController: TObject;
    fObservers: cLista;
  public
    constructor Create(Controller: TObject);overload;
    procedure Attach(Observer: TObserver);
    procedure Detach(Observer: TObserver);
    procedure Notify;
  end;

implementation
constructor TSubject.Create(Controller: TObject);
  begin
    inherited Create;
    fController := Controller;
  end;
  procedure TSubject.Attach(Observer: TObserver);
  begin
    if (fObservers = nil) then
      fObservers := cLista.Create(5);
    fObservers.Insertar(Observer);
  end;
  procedure TSubject.Detach(Observer: TObserver);
  begin
    if fObservers <> nil then
    begin
      fObservers.Remove(Observer);
      if (fObservers.Longitud) = 0 then
      begin
        fObservers.Free;
        fObservers := nil;
      end;
    end;
  end;
  procedure TSubject.Notify;
  var
    i: Integer;
  begin
    if (fObservers <> nil) then
      for i := 0 to Pred(fObservers.Longitud) do
        TObserver(fObservers[i]).Update(fController);
  end;

end.
El objeto consumidor hereda de tObserver y tienda de tSubject.
Pero cuando hago el attach
self.Attach(c);
dentro de procedure TSubject.Attach(Observer: TObserver); la variable observer
nil por lo tanto no me inserta.
¿Como puedo solucionarlo? ¿Tengo que redefinir attach en algún sitio o añadirle algo más a TObserver.

Muchas Gracias,

Jonnathan 24-01-2006 14:26:53

No comprendo muy bien el planteamiento. Dices que Observer = nil cuando usas el procedimiento TSubject.Attach(Observer)???. No he examinado a fondo el código pero me pareció que estaba bien implementado, asi que pienso que el problema esta en el contexto en el que llamas o usas la función Subject.Attach(Observer) y no en la declaración de la clase, si pudieses poner un poco de ese código donde haces esa llamada...

adpa 24-01-2006 14:43:11

Hola
la llamada la hago en la siguiente funcion

Código Delphi [-]
procedure cTienda.pedirVez(c:cConsumidor);
{
DESCRIPCION -> El consumidor pide la vez en la tienda a la que desea ir
 se le asigna su turno.
PRECONDICIÓN -> Lista de tiendas esté creada.
PARAMETROS -> Consumidor que pide la vez
}
begin
     if (c.ClassName = 'cConsumidor') then
     {Mirar si es especial o normal}
     {Es normal}
 begin
 c.setTurno(self.visor.GetTiketN);
        self.visor.SetTiketN(self.visor.GetTiketN+1);
 end
     {Es especial}
     else            
 begin
   c.setTurno(self.visor.GetTiketE);
         self.visor.SetTiketE(self.visor.GetTiketE+1);  
 end;
     self.Attach(c);
end;

c si qué está cargado con los datos del consumidor.

Tengo que reescribir alguna funcion de tObserver en el consumidor.

Muchas Gracias, es muy urgente

kakarotv5 06-02-2007 22:44:48

Otro en apuros ...

maeyanes 06-02-2007 23:10:13

Bueno, pues yo tampoco veo nada raro en el código...

Todo indica que debería ir bien la cosa...

Lepe 07-02-2007 20:19:15

La clase está bien, la culpa la tendrá este individuo:
Código Delphi [-]
fObservers.Insertar(Observer);

¿puedes mostrar el código de insertar?

PD: Puedes usar FreeAndNil(fObservers) en lugar de estas dos lineas:
Código Delphi [-]
        fObservers.Free;
        fObservers := nil;
pues precisamente hace lo mismo, además de controlar una posible excepción al liberar fobservers, que en tu caso, se quedaría apuntando a memoria residual.

Edito: Lo siento, pero en un foro no hay nada urgente.... a saber cuando voy a conectarme de nuevo :(;) .

Saludos


La franja horaria es GMT +2. Ahora son las 16:59:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi