[c#] Abstract vs Virtual methods + andere vragen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sp3ci3s8472
  • Registratie: Maart 2007
  • Laatst online: 04-09 00:08

Sp3ci3s8472

@ 12 graden...

Topicstarter
Sinds 2 jaar programmeer ik pas, nu ik de Unity tool gebruik merk ik dat ik toch meer interesse krijg voor programmeren :P. De tool bied verschillende talen aan een daarvan is c#, ik doe nu steeds meer kennis op maar ik kom soms nog dingen tegen die mij niet duidelijk zijn en die lastig te vinden zijn op internet.

Eerste vraag, het volgende is mij onduidelijk, c# bied abstract en virtual methods aan.
Abstract zorgt er voor dat je een lege methode kan overriden in een andere classe.
Virtual zorgt ervoor dat je een methode kan overriden in een andere classe.

Nu heb ik tot kort alleen Abstract gebruikt, maar waarom zou ik dat nog gebruiken als Virtual mij meer functionaliteit geeft?

Tweede vraag, is er ook een mogelijkheid dat ik een stuk code in mijn virtual method hergebruik bijvoorbeeld.

code:
1
2
3
4
5
6
7
8
9
10
virtual void piet()
{
    doe dingen
}

override void piet()
{
    doe dingen (zonder dit te typen obviously)
    doe andere dingen
}



Derde vraag, stel dat ik een stuk code waar het belangrijk is dat hij bij een bepaalde conditie direct uit de functie gaat bijvoorbeeld (zie onder), is het dan netter om de "else" weg te laten voor een de if? Volgens mij wordt dit ook failure first genoemd?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected void StatePiet()
{
    if (piet == false)
    {
        StateUpdate = StateJan;
        return;
    }
    else if (peter == true)
    {
        StateUpdate = StatePeter;
        return;
    }

    andere code
}


Laatste vraag, wat is meest gebruikte volgorde van keywords (abstract, public, protected, override, void, etc) bij sommige talen maakt dit dacht ik wel iets uit?

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

abstract methods MOET je overriden, virtual methods MAG je overriden.

Van SO:


An abstract function can have no functionality. You're basically saying, any child class MUST give their own version of this method, however it's too general to even try to implement in the parent class. A virtual function, is basically saying look, here's the functionality that may or may not be good enough for the child class. So if it is good enough, use this method, if not, then override me, and provide your own functionality.


Zo zal de virtual method GooiInFrituur() van de baseclass Snack in class Kroket, Frikandel en Kaassouffle bijvoorbeeld NIET overrriden worden, maar bijvoorbeeld wel in de class Loempia omdat deze bijvoorbeeld eerst even goed aangedrukt moet worden (ik noem maar wat, ben geen snackbar expert :+ )

Echter, de methode getPrice kan prima abstract zijn, want niets heeft dezelfde prijs, toch wil je dat elke Snack implementatie deze methode heeft.

[ Voor 107% gewijzigd door Wijnbo op 04-09-2012 15:25 ]


Acties:
  • 0 Henk 'm!

  • Sp3ci3s8472
  • Registratie: Maart 2007
  • Laatst online: 04-09 00:08

Sp3ci3s8472

@ 12 graden...

Topicstarter
Wijnbo schreef op dinsdag 04 september 2012 @ 15:20:
abstract methods MOET je overriden, virtual methods MAG je overriden.
Zover was ik ook al, maar waarom zou je dan ooit een abstract gebruiken als een virtual ook kan. Of is het een soort van programmeer etiquette :p. Geeft virtual bijvoorbeeld meer overhead?

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

Sp3ci3s8472 schreef op dinsdag 04 september 2012 @ 15:24:
[...]


Zover was ik ook al, maar waarom zou je dan ooit een abstract gebruiken als een virtual ook kan. Of is het een soort van programmeer etiquette :p. Geeft virtual bijvoorbeeld meer overhead?
Zie aanvulling ;-)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Sp3ci3s8472 schreef op dinsdag 04 september 2012 @ 15:24:
Zover was ik ook al, maar waarom zou je dan ooit een abstract gebruiken als een virtual ook kan. Of is het een soort van programmeer etiquette :p. Geeft virtual bijvoorbeeld meer overhead?
Omdat je soms in situaties komt waarbij er voor de superclass helemaal geen implementatie bestaat. Stel je hebt een abstracte Reader. Dat is een class die ergens bytes uit kan lezen. Echter heeft die reader geen idee waar hij zijn bytes uithaalt. Je kunt daar dus de methode readByte() niet implementeren. Je kunt echter wel een readBytes(int length) implementeren welke 'length' keer de readByte() methode aanroept. Een child class kan bijvoorbeeld een file reader zijn welke vervolgens alleen een readeByte methode implementeerd welke een byte uit een bestand leest. Maar het kan ook een socketReader zijn waarbij de readByte methode zijn byte uit een netwerksocket leest.
Sp3ci3s8472 schreef op dinsdag 04 september 2012 @ 15:15:
Tweede vraag, is er ook een mogelijkheid dat ik een stuk code in mijn virtual method hergebruik bijvoorbeeld.

code:
1
2
3
4
5
6
7
8
9
10
virtual void piet()
{
    doe dingen
}

override void piet()
{
    doe dingen (zonder dit te typen obviously)
    doe andere dingen
}
Bij java is dat super(). Daarmee roep je de implementatie van de superclass aan. C# zal daar ook wel iets voor hebben.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:06
Janoz schreef op dinsdag 04 september 2012 @ 15:43:
[...]

Omdat je soms in situaties komt waarbij er voor de superclass helemaal geen implementatie bestaat. Stel je hebt een abstracte Reader. Dat is een class die ergens bytes uit kan lezen. Echter heeft die reader geen idee waar hij zijn bytes uithaalt. Je kunt daar dus de methode readByte() niet implementeren. Je kunt echter wel een readBytes(int length) implementeren welke 'length' keer de readByte() methode aanroept. Een child class kan bijvoorbeeld een file reader zijn welke vervolgens alleen een readeByte methode implementeerd welke een byte uit een bestand leest. Maar het kan ook een socketReader zijn waarbij de readByte methode zijn byte uit een netwerksocket leest.


[...]


Bij java is dat super(). Daarmee roep je de implementatie van de superclass aan. C# zal daar ook wel iets voor hebben.
base()
Tweede vraag, is er ook een mogelijkheid dat ik een stuk code in mijn virtual method hergebruik bijvoorbeeld.

code:
1
2
3
4
5
6
7
8
9
10
virtual void piet()
{
    doe dingen
}

override void piet()
{
    doe dingen (zonder dit te typen obviously)
    doe andere dingen
}
Zonder te typen, nee dus. Dat wordt dus:
C#:
1
base().doe dingen

[ Voor 16% gewijzigd door sig69 op 04-09-2012 15:49 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Sp3ci3s8472
  • Registratie: Maart 2007
  • Laatst online: 04-09 00:08

Sp3ci3s8472

@ 12 graden...

Topicstarter
Mooi!, base().functy bespaard mij in sommige gevallen toch weer copy pasten, plus de code ziet er netter uit :P.

Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 18:56

BM

Moderator Spielerij
maar dan zonder de haakjes afaik :)
C#:
1
base.doedingen();

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:28

Haan

dotnetter

BM schreef op dinsdag 04 september 2012 @ 16:32:
maar dan zonder de haakjes afaik :)
C#:
1
base.doedingen();
Klopt, het is vergelijkbaar met het gebruik van het 'this' keyword.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 18:19
Wijnbo schreef op dinsdag 04 september 2012 @ 15:20:
abstract methods MOET je overriden, virtual methods MAG je overriden.


Zo zal de virtual method GooiInFrituur() van de baseclass Snack in class Kroket, Frikandel en Kaassouffle bijvoorbeeld NIET overrriden worden, maar bijvoorbeeld wel in de class Loempia omdat deze bijvoorbeeld eerst even goed aangedrukt moet worden (ik noem maar wat, ben geen snackbar expert :+ )

Echter, de methode getPrice kan prima abstract zijn, want niets heeft dezelfde prijs, toch wil je dat elke Snack implementatie deze methode heeft.
Mag ik je bedanken voor deze briljante uitleg. Ik heb virtueel vs abstract nooit helemaal begrepen, maar deze maakt alles helder :+ _/-\o_

Heb nu overigens wel honger gekregen van dit voorbeeld. :9~

Acties:
  • 0 Henk 'm!

  • Wijnbo
  • Registratie: December 2002
  • Laatst online: 06-09 20:35

Wijnbo

Electronica werkt op rook.

pdebie schreef op dinsdag 04 september 2012 @ 16:57:
[...]


Mag ik je bedanken voor deze briljante uitleg. Ik heb virtueel vs abstract nooit helemaal begrepen, maar deze maakt alles helder :+ _/-\o_

Heb nu overigens wel honger gekregen van dit voorbeeld. :9~
Thx. En natuurlijk is het een slecht OO voorbeeld, beter is een public void AddSnack(Snack snackySnackSnack) in de class Fryer maar dat terzijde :+

Acties:
  • 0 Henk 'm!

  • Sp3ci3s8472
  • Registratie: Maart 2007
  • Laatst online: 04-09 00:08

Sp3ci3s8472

@ 12 graden...

Topicstarter
Wijnbo schreef op dinsdag 04 september 2012 @ 17:07:
[...]


Thx. En natuurlijk is het een slecht OO voorbeeld, beter is een public void AddSnack(Snack snackySnackSnack) in de class Fryer maar dat terzijde :+
Haha :P, maakt het wel duidelijker nu je met eten gaat werken :9 .
Pagina: 1