Aquí podría ser tu PUBLICIDAD


Herencia y eventos

votos
0

Tengo una interfaz definida así:

public interface IRipper
{
    IRipperHost Host { get; set; }

    void Rip(FileStream stream);

    event RipperEventHandler OnStart;
    event RipperEventHandler OnComplete;
    event RipperEventHandler OnProgressChanged;        
}

public delegate void RipperEventHandler(object sender, RipperEventArgs e);

y una clase base que implementa esa interfaz

public class RipperBase : IRipper
{

    public void Rip(FileStream stream)
    {
        throw new System.NotImplementedException();
    }
    public event RipperEventHandler PostRipEvent;
    event RipperEventHandler IRipper.OnComplete
    {
        add
        {
            if (PostRipEvent != null)
            {
                lock (PostRipEvent)
                {
                    PostRipEvent += value;
                }
            }
            else
            {
                PostRipEvent = value;
            }
        }
        remove
        {
            if (PostRipEvent != null)
            {
                lock (PostRipEvent)
                {
                    PostRipEvent -= value;
                }
            }
        }
    }
    ... and so on
}

Mi pregunta es ¿cómo se heredan de RipperBase y reemplazar el método BaseClass Rip. en realidad, esa función debe ser abstracta, pero no sé cómo hacer eso con las interfaces.

Además, ¿cómo puedo llamar al controlador de eventos de las clases base de la clase derivada de RipperBase? Intenté esto

    RipperEventHandler handler = PreRipEvent;
    if (handler != null)
    {
        handler(this, new RipperEventArgs { Message = Started Ripping file to CSV! });
    }

    handler = RipProgEvent;

esto, pero estoy obteniendo el evento solo puede aparecer en el lado izquierdo de + = o - =. error

cualquier ayuda sería muy apreciada! Estoy tratando de hacer esto lo más escalable posible.

Publicado el 12/03/2009 a las 19:32
fuente por usuario Michael G
En otros idiomas...        العربية       

4 respuestas

votos
1

Lo haría así:

    public abstract class RipperBase : IRipper
    {
        public void Rip( Filestream fs )
        {
             RipCore (fs);
             OnCompleted();
        }

        protected abstract void RipCore(Filestream fs);

        public event EventHandler<RipperEventArgs> Completed;

        protected void OnCompleted
        {
           if( Completed != null )
           {
               // TODO: make this Threadsafe.
               Completed (this, new RipperEventArgs( ... ) );
           }
        }
}

He declarado la clase como abstracta, ya que supongo que no puedes crear una instancia de objetos de RipperBase.

Las clases que heredan de RipperBase tienen que anular el método RipCore e implementar la funcionalidad correcta. Rip es el método que llama al método RipCore, y también aumenta el manejador de eventos Completed. (Tal vez usted no quiere hacer esto, no sé).

También puede asegurarse de que el método Rip llame al método RipCore en otro hilo si lo desea.

Para los eventos, creo un método protegido en la clase base que puede usarse para plantear los eventos. Si desea plantear el evento en una subclase, simplemente llame a este método.

Respondida el 12/03/2009 a las 07:49
fuente por usuario Frederik Gheysels


Aquí podría ser tu PUBLICIDAD


votos
1

declara el método en la clase base como virtual, como:

public virtual void Rip(FileStream stream)
{
    throw new System.NotImplementedException();
}

y en la clase específica:

public override void Rip(FileStream stream){}

Para el evento, haz esto en la base:

protected void FireASpecificEvent(SomeClass someArguments)
{//fire event normally
}
Respondida el 12/03/2009 a las 07:44
fuente por usuario eglasius

votos
0

Tal vez sería mejor que hicieras una clase base abstracta de Destripador.

Además, utilice el tipo genérico EventHandler <> para sus eventos en lugar de declarar otro tipo (RipperEventHandler). Por ejemplo:

event EventHandler<RipperEventArgs> OnStart;
Respondida el 12/03/2009 a las 07:51
fuente por usuario Sean

votos
0

No sé si esto puede ayudar, pero creo que debería etiquetar la función Rip con acceso virtual, por lo que puede ser reemplazable,

y sobre el evento, tal vez puedes intentar crear un método en la clase base OnPreRipEventFired (), no sé, solo dando ideas

Respondida el 12/03/2009 a las 07:44
fuente por usuario Jhonny D. Cano -Leftware-