[c# .NET] Overriden van een method in een derived class *

Pagina: 1
Acties:
  • 206 views sinds 30-01-2008
  • Reageer

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
EDIT:

Hieronder stond eerst heel iets anders. Ik heb dit veranderd omdat de oplossing voor het probleem wat ik heb ook met het overriden van methods kan. De topic titel zou dan ook veranderd kunnen worden in:

[c# .NET] Overriden van een method in een derived class


Ik heb het volgende.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CChannel{
public void endConnect(IAsyncResult aRes)
        {
            //end connect op de huidige socket om de beginconnect af te ronden.
            try
            {
            //connect statements            
                                                }
            catch(SocketException se)
            {
                log(se.Message);
                connectionFailed();
                rConnect();         
            }           
        }

public virtual  void connectionFailed()
        {   
            log("BOOOOOOOOOOOE");
        }
}


en

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CUserChannel : CChannel{

public bool rConnectToServer()
        {
    base.rConnect()
        }

public override void connectionFailed()
        {
            System.Console.WriteLine("YIHAAAAAAAAAAAAAAA");

        }

}


Maar als er nu een Exceptie optreed in CChannel dan krijg ik als output dus "BOOOOOOOOOOOE".

maar wat is nu het verschil tussen het bovenstaande en het volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
public class A
    {
        public A(){}

        public void callG(){g();}   

        public virtual void g()
        {
            System.Console.WriteLine("A.G");
        }
    }


code:
1
2
3
4
5
6
7
8
9
10
public class B: A
    {
        public B(){callG();
        }

        public override void g()
        {
            System.Console.WriteLine("B.G");
        }
    }


en dit geeft netjes B.G als uitput.

Ik wil dus dat in het geval van een failed connectie er een bepaald gedrag plaats vind. Dit gedrag kan alleen per channel verschillen(ik heb verschillende soorten kanalen). Dit wilde ik eerst oplossen met events, maar dit kan dus ook door het overriden van de connectionFailed() methode. Dit is aangetoond met het simpele l test projectje waarvan de code hierboven staat.

[ Voor 91% gewijzigd door yrew op 05-10-2004 16:09 ]

Groetjes


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Kun je niet de protected method overriden?

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Welke protected method?

Groetjes


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je hebt geen events nodig. Gewoon dit doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class a{
     public event FireConnectionHandler mConnectionEvent;

     public void fireConnectionEvent(bool aSucces)
     {
        SignalB("success");
     }
     
     public virtual void SignalB(string message) {}
}


class  b : a{

  public bool rConnectToServer()
  {

     base.rConnect()
     return false;
   }
   
   public override void SignalB(string message)
   {
        // do your thing.
   }
}

[ Voor 4% gewijzigd door EfBe op 05-10-2004 13:29 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Sorry, maar dit werkt dus niet. Ik heb dit al geprobeerd.

edit:

voor ik zomaar loop te blaten, zal ik dit eerst nog even testen.....Mezelf kennende zal ik misschien iets over het hoofd hebben gezien....Hold on!

[ Voor 59% gewijzigd door yrew op 05-10-2004 13:33 ]

Groetjes


  • JeroenTheStig
  • Registratie: Mei 2000
  • Laatst online: 21-05 18:27
yrew schreef op 05 oktober 2004 @ 13:30:
Sorry, maar dit werkt dus niet. Ik heb dit al geprobeerd.
wil je de code dan eens laten zien? want dat moet gewoon werken

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Als je de base class ook zelf schrijft kun je het beter met een abstracte method doen idd.

Maar wat werkt er dan niet?

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
zie mijn edit....geef me ff de tijd, ik maak even een nieuw project aan.

edit:


gegeven:

class a heeft methode g
en een class b erft van a en overschrijft methode g

als ik nu a.g doe, dan krijg ik nooit b.g

maar ik zal dit eerst nog even uitwerken. (val ik in heraling?)

[ Voor 60% gewijzigd door yrew op 05-10-2004 13:35 ]

Groetjes


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

yrew schreef op 05 oktober 2004 @ 13:33:
als ik nu a.g doe, dan krijg ik nooit b.g
Is toch logies, je kan gewoon b.g doen.
Wil je a.g in een instancie van b, doe dan
code:
1
((a)b).g();

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
<edit>

Hier stond eerst een voorbeeld code die ik later in een post heb aangepast. Om het topic een beetje overzichtelijk te houden heb ik de foute code even weggehaald.

[ Voor 100% gewijzigd door yrew op 05-10-2004 15:43 ]

Groetjes


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Het lijkt mij voor jou makkelijk als je het met de debugger is stap voor stap bekijkt. Gewoon een break zetten en elke keer een step doen.

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Het lijkt me makkelijker als ik nadenk voor ik post ;)

Maar inderdaad, ik ben ff met de debugger aan de gang gegaan. En het 1 en ander veranderd.

in principe heb ik het nu werkend.

ik heb nu het volgende

code:
1
2
3
4
5
6
7
8
9
10
11
public class A
    {
        public A(){}

        public void callG(){g();}   

        public virtual void g()
        {
            System.Console.WriteLine("A.G");
        }
    }


code:
1
2
3
4
5
6
7
8
9
10
public class B: A
    {
        public B(){callG();
        }

        public override void g()
        {
            System.Console.WriteLine("B.G");
        }
    }


en dit geeft netjes B.G als uitput. Ik ga eens even kijken waarom ik dit gisteren in mijn applicatie niet werkend kreeg.

Groetjes


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Waarom doe je hetvolgende?

code:
1
2
3
4
public void callG()
{
   g();
}

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Dat doe ik omdat ik het volgende wil

code:
1
2
3
4
5
6
7
8
public void connect(){
  try{
    allerlei connect statements
  }catch(een fout)
  {
     connectionFailed(); 
  {
}


Om dit uit te proberen heb ik dus een callG methode gebruikt

Groetjes


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Maar je roepte net een public method aan met een anderen public method. Dit snapte ik even niet :?

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Ik zou het even raar vinden als jij. ;)

Maar nu ik dit in mijn applicatie probeer gaat het toch mis.

ik heb het volgende nu, in CHannel wordt uiteraard eerst beginConnect aangeroepen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CChannel{
public void endConnect(IAsyncResult aRes)
        {
            //end connect op de huidige socket om de beginconnect af te ronden.
            try
            {
            //connect statements            
                                                }
            catch(SocketException se)
            {
                log(se.Message);
                connectionFailed();
                rConnect();         
            }           
        }

public virtual  void connectionFailed()
        {   
            log("BOOOOOOOOOOOE");
        }
}


en

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CUserChannel : CChannel{

public bool rConnectToServer()
        {
    base.rConnect()
        }

public override void connectionFailed()
        {
            System.Console.WriteLine("YIHAAAAAAAAAAAAAAA");

        }

}


Maar als er nu een Exceptie optreed in CChannel dan krijg ik als output dus "BOOOOOOOOOOOE"

Groetjes


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
yrew schreef op 05 oktober 2004 @ 13:45:
ai volgens mij leg ik me verkeerd uit.

code:
1
2
3
4
5
6
7
8
9
10
11
12
public class A
    {
        public A()
        {
            g();
        }

        public virtual void g()
        {
            System.Console.WriteLine("A.G");
        }
    }


code:
1
2
3
4
5
6
7
8
9
10
11
12
public class B: A
    {
        public B()
        {
            g();
        }

        public override void g()
        {
            System.Console.WriteLine("B.G");
        }
    }


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class test
    {
        public test()
        {
            A myA = new A();
            B myB = new B();

            myA.g();
            myB.g();

            while(true){}
        }

        static void Main()
        {
            test tTest = new test();


        }
    }


mijn output is (en ik vind hem zelf iets raar)

A.G
B.G
B.G
A.G
B.G

Ik wil dus dat de methode die in de constructor van A staat, de "g-methode" van B uitvoert.

[edit]
output is niet raar, hij creeert een extra A instantie doordat A ge-extend wordt in B
Nooit virtuele methods aanroepen in een constructor.
De code van EfBe moet gewoon werken.
Je kan in een inherited class geen events gaan firen die in de base class gedefinieerd zijn. (Tenzij je het event keyword weglaat, maar dat wil je niet want dat is juiste de bedoeling daarvan).

[ Voor 11% gewijzigd door whoami op 05-10-2004 14:35 ]

https://fgheysels.github.io/


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Ha Whoami, hier was ik zelf ook al achter. Als je naar mijn tweede test-code kijkt heb ik het ook met callG() opgelost. Die test code werkt ook gewoon. Maar in mijn applicatie niet. Zie mijn laaste code-dump.

Ik probeer trouwens ook geen events af te vuren in mijn derived class. Ik probeer ze daar alleen op te vangen.

Ik zie iets simpels over het hoofd...ik weet het zeker. Net als toen met het implementeren en extenden in 1 class....Toen kwam je met het goede antwoord en dat was ook heel simpel. ([rml][ c# .Net]Implementeren interface plus extenden van een class[/rml] )

[ Voor 51% gewijzigd door yrew op 05-10-2004 14:44 ]

Groetjes


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
yrew schreef op 05 oktober 2004 @ 14:32:
Ik zou het even raar vinden als jij. ;)

Maar nu ik dit in mijn applicatie probeer gaat het toch mis.

ik heb het volgende nu, in CHannel wordt uiteraard eerst beginConnect aangeroepen

Maar als er nu een Exceptie optreed in CChannel dan krijg ik als output dus "BOOOOOOOOOOOE"
:?
Dat is toch logisch? Als je een instantie van CChannel hebt, dan zal de implementatie van CChannel aangeroepen worden.
Als je een instantie hebt van MyChannel, zal de instantie van MyChannel gebruikt worden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CChannel
{
    public virtual void ExceptSpul()
    {
           throw new ("CChannel");
    }
}

public class MyChannel
{
    public override void ExceptSpul()
    {
           throw new Exception("MyChannel");
    }
}

code:
1
2
3
4
5
6
CChannel c = new CChannel();
c.ExceptSpul();
CChannel m = new MyChannel();
m.ExceptSpul();
MyChannel m2 = new MyChannel();
m2.ExceptSpul();

De output hiervan zal zijn:
- CChannel
- MyChannel
- MyChannel

https://fgheysels.github.io/


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
HUH?!?!?

Maar ik instantieer CCHannel niet. Ik extend hem alleen in CUserChannel. CChannel onderhoud zijn hele connect gebeuren (drie x inloggen, heartbeat etc). Naast een CUserChannel heb ik strakst verschillende CDeviceChannels en die extenden allemaal CCHannel.

Ik wil dus in CUserChannel een ander gedrag dan in CDeviceChannel in het geval de connectie Failed.

<edit>

Soms heb je van die dagen dat je er helemaal niets meer van snapt |:(

[ Voor 11% gewijzigd door yrew op 05-10-2004 15:04 ]

Groetjes


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Ik heb het 1 en ander aangepast in mijn posts. Gedurende dit topic ben ik overgestapt van events naar method overiden om mijn probleem op te lossen. Zou er een mod mijn topic titel aan kunnen passen (zie start-post). Hoop niet dat ik nu tegen de got policy in ga. (ik zwerf hier pas vier jaar rond en nog weet ik het niet)

Groetjes


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

yrew schreef op 05 oktober 2004 @ 15:45:
Hoop niet dat ik nu tegen de got policy in ga. (ik zwerf hier pas vier jaar rond en nog weet ik het niet)
Dit kun je even zelf bekijken, zeker na 4jaar zou je het al wel bekeken moeten hebben. Stuur even een topic report, boven in het topic zie je een handje, klik daar of even op deze link: http://gathering.tweakers...sert_topicreport/962809/0

[ Voor 11% gewijzigd door pjvandesande op 05-10-2004 15:49 ]


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
:D Voor het eerst he.....noe me maar een lambal. Thanx for pointing that out.

Groetjes


  • EfBe
  • Registratie: Januari 2000
  • Niet online
ALs je een class extend dmv inheritance en je override een method in de base class door daar andere functionaliteit aan toe te voegen (zoals ik liet zien, wat genoemd wordt 'polymorphism') en je maakt geen instance aan van die derived class, ja dan zal je code nooit werken nee. Je moet dus een instance maken van je derived class, niet van je base class, dus je moet doen zoals whoami je uitlegt.

Dit principe wat is toegepast heet overigens het strategy pattern, weet je dat ook weer :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
EfBe schreef op 05 oktober 2004 @ 16:28:

Dit principe wat is toegepast heet overigens het strategy pattern, weet je dat ook weer :)
Dat principe wordt eigenlijk in vrijwel alle 'patterns' toegepast. (Finding what varies & encapsulate it).

https://fgheysels.github.io/


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 20-05 18:31
Goed.........Op werk zou ik mezelf hier een loempia-punt voor geven.

Ik heb eerst CChannel getest met een testclass. En na het afschrijven van CUserChannel mijn testclass niet aangepast. Argh, gisteren hier dus ook overheen zitten kijken. Bedankt voor alle reacties. Heb er wel weer wat van opgestoken, behalve de ontdekking van deze stomme fout.

Groetjes

Pagina: 1