Avatar billede Lasse Novice
26. februar 2003 - 16:49 Der er 11 kommentarer og
1 løsning

delegates i inherited klasse

Jeg har en public delegate StatusChange i en klasse A. Klasse B nedarver fra klasse A.

I klasse B skriver jeg foelgende:

if(this.StatusChange != null)
    this.StatusChange(this, new Helpers.TabPageStatusChangeEventArgs(Helpers.TabPageStatus.FETHINGFROMDB));

Idet jeg proever at kompilere, faar jeg fejl ved alle StatusChange(blaa streg):

C:\Documents and Settings\gooky\My Documents\Visual Studio Projects\Copy of Griffer\Forms\TabPages\TabPage1.cs(121): The event 'SpecificTabPages.TabPageCommon.StatusChange' can only appear on the left hand side of += or -= (except when used from within the type 'SpecificTabPages.TabPageCommon')

Er der nogle specielle regler med at man ikke kan 'arve' en delegate?

Paa forhaand tak for alle svar.
Avatar billede Lasse Novice
26. februar 2003 - 17:01 #1
Jeg kunne altid i parent klassen, addere en function til delegaten, og derved slippe for at spoerge paa om den er null.

Det virker dog bare ulogisk at jeg ikke kan goere dette........
Avatar billede Lasse Novice
26. februar 2003 - 17:43 #2
http://www.vijaymukhi.com/documents/books/csadv/chap5.htm

Jeg har loest det ved i min parent klasse at lave en FireStatusChange(object sender, Helpers.TabPageStatusChangeEventArgs e)
{
if(this.StatusChange != null)
  this.StatusChange(sender, e);
}

Jeg syntes dog ikke at det er den bedste loesning eftersom jeg nu opretter en instans af:

Helpers.TabPageStatusChangeEventArgs

hvilken muligvis ikke bliver brugt...
Avatar billede z42cool Nybegynder
26. februar 2003 - 21:42 #3
Hvordan ser din linie 121 (den med fejl ud) i TabPage1.cs?
Avatar billede Lasse Novice
26. februar 2003 - 22:25 #4
121 if(this.StatusChange != null)
122    this.StatusChange(this, new Helpers.TabPageStatusChangeEventArgs(Helpers.TabPageStatus.FETHINGFROMDB));
Avatar billede z42cool Nybegynder
26. februar 2003 - 22:35 #5
Oh... Nu tror jeg at jeg er med. Du kan ikke teste for om en delegate er null, du skal teste om dit event er null.

public delegate StatusChangeEventHandler(object sender, StatusChangeEventArgs e);

public class A
{
  public event StatusChangeEventHandler StatusChange;

  protected virtual void OnStatusChange(StatusChangeEventArgs e)
  {
    if (StatusChange!=null)
      StatusChange(this, e);
  }
}

Så kan du i subklasser bare:

public class B : A
{
  public void MyFunc()
  {
    //Gør noget der kræver at StatusChange eventet fyres
   
    //Affyr StatusChange
    this.StatusChange(new StatusChangeEventArgs());
  }
}
Avatar billede Lasse Novice
26. februar 2003 - 23:06 #6
Delegaten er allerede erklaeret saaledes:
public delegate StatusChangeEventHandler(object sender, TabPageStatusChangeEventArgs e);

Eventet er allerede erklaeret saaledes:

public event StatusChangeEventHandler StatusChange;

ligesom i dit eksempel

jeg glemte at skrive at der ogsaa er fejl i linie 122. Har du proevet den kode som du skriver selv??? Jeg kan kun se at det er den samme som jeg selv har lavet. Men jeg tager maaske fejl...
Avatar billede z42cool Nybegynder
26. februar 2003 - 23:10 #7
Så er jeg lidt forvirret! Du starter med at skrive "Jeg har en public delegate StatusChange", men du mener altså at du har et public event StatusChange? Og hvis du har erklæret dit event i klassen a, så er det også i klassen a at du skal have:

if (StatusChange!=null)
  StatusChange(this, e);
Avatar billede Lasse Novice
26. februar 2003 - 23:38 #8
ahh, ja sorry, det har du ret i....

men som du selv skriver saa skal jeg have :
if (StatusChange!=null)
  StatusChange(this, e);

i den klasse jeg erklaerer eventet i og det kan ikke lade sig goere at have det i en klasse som arver denne klasse.... er det rigtigt forstaaet?
Avatar billede z42cool Nybegynder
26. februar 2003 - 23:50 #9
Det tror jeg ikke, men det vil heller aldrig være nødvendigt idet du i din parent klasse blot har:

protected virtual void OnStatusChange(EventArgs e)
{
  if (StatusChange!=null)
    StatusChange(this, e);
}

Så kan du jo, fordi OnStatusChange er protected tilgå metoden fra dine nedarvede klasser og derved også fyre eventet. Du kan således ikke opnå noget ved at placer if sætningen i en nedarvet klasse som du ikke også opnår ved at have den i parent sætningen.
Avatar billede Lasse Novice
27. februar 2003 - 01:55 #10
Jeg ville ellers mene at jeg kan opnaa ikke at oprette en instans af typen EventArgs. Det bliver jeg noedt til med denne metode...

Men det gaar nok ogsaa...
Avatar billede z42cool Nybegynder
27. februar 2003 - 09:12 #11
Du opretter da allerede en EventArgs instans med new Helpers.TabPageStatusChangeEventArgs(Helpers.TabPageStatus.FETHINGFROMDB).

Dette er hvad du startede med i klasse B:

if(this.StatusChange != null)
    this.StatusChange(this, new Helpers.TabPageStatusChangeEventArgs(Helpers.TabPageStatus.FETHINGFROMDB));

Ved at flytte:

protected virtual void OnStatusChange(StatusChangeEventArgs e)
{
  if(this.StatusChange != null)
      this.StatusChange(this, e);
}

op i klasse a, så kan du i klasse b:

this.OnStatusChange(new Helpers.TabPageStatusChangeEventArgs(Helpers.TabPageStatus.FETHINGFROMDB));
Avatar billede Lasse Novice
28. februar 2003 - 04:11 #12
ok... det er ikke noget stoerrere, men formaalet var - med min if saetning - ikke at oprette en instans af Helpers.TabPageStatusChangeEventArgs hvilket man i dette tilfaelde bliver noedt til at goere :-( Men det gaar nok....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Netcompany A/S

IT Consultant

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations

IT-Universitetet i København

CIO