Archief - C#: verschil tussen new en override?

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Cakeman

Legacy Member
Ik heb me deze week een boek over C# gekocht. Aangezien ik al wat programmeerervaring heb (VB 6.0 en Java) heb ik tot nu toe nog niet echt veel problemen gehad.

Ik zit nu aan een hoofdstuk over inheritance en polymorphism.
Daar wordt (eerder vaag) het verschil tussen een 'new method' en een 'override method' uitgelegd, maar ik snap het nog niet echt goed.

Voorbeeld uit het boek over 'new':
Code:
public class Window
{
    private int top;
    private int left;

    public Window(int top, int left)
    {
        this.top = top;
        this.left = left;
    }

    [b]public void DrawWindow()[/b]
    {
        Console.WriteLine("Drawing window at {0}, {1}", top, left);
    }
}

public class ListBox : Window
{
    private string lbContents;

    public ListBox(int top, int left, string contents) : base(top, left)
    {
        lbContents = contents;
    }

    // a new version (note keyword) because in the
    // derived method we change the behaviour
    [b]public new void DrawWindow()[/b]
    {
        base.DrawWindow();  // invoke the base method
        Console.WriteLine("Writing string to the listbox: {0}", lbContents);
    }
}

Analoog voorbeeld, maar dan over 'override':
Code:
public class Window
{
    private int top;
    private int left;

    public Window(int top, int left)
    {
        this.top = top;
        this.left = left;
    }

    [b]public virtual void DrawWindow()[/b]
    {
        Console.WriteLine("Drawing window at {0}, {1}", top, left);
    }
}

public class ListBox : Window
{
    private string lbContents;

    public ListBox(int top, int left, string contents) : base(top, left)
    {
        lbContents = contents;
    }

    // an overriden version (note keyword) because in the
    // derived method we change the behaviour
    [b]public override void DrawWindow()[/b]
    {
        base.DrawWindow();  // invoke the base method
        Console.WriteLine("Writing string to the listbox: {0}", lbContents);
    }
}

Het enige verschil dat ik zie, is dat bij overriden, de base method het keyword 'virtual' krijgt.

Wanneer gebruik je 'new' en wanneer gebruik je 'override'? Wat is het grote verschil?

Squall-sX-

Legacy Member
Eerst en vooral is dit het "webdesign" forum, en is je post dus verkeerd geplaatst.

Ten tweede: die virtual zal aangeven dat je deze methode kunt (moogt) overriden. Ik geloof niet dat er een verschil is tussen de twee (buiten dat override alleen werkt met methodes die overridden mogen worden). Je kunt dit altijd testen door de twee voorbeelden te gebruiken en de console te bekijken.

Squall-sX-

Legacy Member
Ik heb ff die klasse aangemaakt en getest, en ze doen juist hetzelfde, met dit als verschil:

- override: de basismethode moet gemarkeerd zijn met virtual
- new: altijd toepasbaar

Er is dus geen verschil in wat ze doen, het is gewoon zo dat je niet altijd override kunt gebruiken.

Cakeman

Legacy Member
Squall-sX- zei:
Eerst en vooral is dit het "webdesign" forum, en is je post dus verkeerd geplaatst.
Waar hoort deze post dan wel thuis?

Squall-sX- zei:
Ten tweede: die virtual zal aangeven dat je deze methode kunt (moogt) overriden. Ik geloof niet dat er een verschil is tussen de twee (buiten dat override alleen werkt met methodes die overridden mogen worden). Je kunt dit altijd testen door de twee voorbeelden te gebruiken en de console te bekijken.
In de console leveren ze allebei identiek hetzelfde resultaat op.
Daarom ook dat ik mij afvraag wanneer ik virtual en override moet gebruiken wanneer ik net zo goed geen virtual en new kan gebruiken.

Homer

Legacy Member
link

blijkbaar kunde door new te grbuiken een functie aanmaken die dezelfde naam heeft, maar toch niet override van de base class. Wat het nut daarvan is, is me een raadsel want het lijkt mij niet echt "goede" code.

Homer

Legacy Member
Even later:

If you use new to create a new member of a derived class, it *won't* be
visible to references of the base class type, even if instantiated as the
derived class. New hides members of the derived class from the base.
Override makes overridden members visible to the base class. References
which are of the base type will use the overidden member instead of their
own, when the object they refer to is the derived type.

Hetgeen ik er dus uit begrijp:

Als ge "new" gebruikt hide je de base method.
Als we echter polymorfisme toepassen (Rectangle, Triangle, Circle are Figures) zullen toch de base methods worden aangesproken (indien je dus new gebruikt)

bv
Code:
foreach(Figure fig in Figures)
{
    MessageBox.Show(fig.Oppervlakte().ToString());
}

Bij new zal hij dus de method Oppervlakte() van de Figure gebruiken.
Bij override zal hij de method Oppervlakte() van Rectangle gebruiken.

Homer

Legacy Member
zoals ik dus al zei :)

Code:
yyy c = new xxx();
c.abc();c.pqr();c.xyz();

OUTPUT:
yyy abc

yyy pqr

yyy xyz

hoewel je x instantieert als een xxx-object (maar cast in een yyy object) zal hij toch de methods oproepen van de base class yyy.

Indien je dus override had gebruikt (mits wa aanpassingen aan yyy (virtual gebruiken) :

Code:
class xxx : yyy
{
    public override void abc()
    {
        System.Console.WriteLine(“xxx abc”);
    }

    public override void pqr()
    {
        System.Console.WriteLine(“xxx pqr”);
    }

    public override void xyz()
    {
        System.Console.WriteLine(“xxx xyz”);
    }
}

yyy c = new xxx();

OUTPUT:
xxx abc
xxx pqr
xxx xyz

Iets om te testen :)

Cakeman

Legacy Member
Ik heb deze nacht heel die uitleg eens grondig gelezen en ik denk nu dat ik alles zo een beetje begin te snappen.

Nu rest mij nog één vraag. Ik denk dat ik het juiste antwoord al weet, maar voor de zekerheid ga ik ze toch stellen.

Voorbeeldje:
Code:
public class Person
{
    // constructor enzo
    // ...
    
    public int CalculateAge()
    {
        // return één of andere berekening
    }

    public virtual void SetName(string newName)
    {
        // nieuwe naam instellen
    }
}

public class Male : Person
{
    // constructor enzo
    // ...

    public new int CalculateAge()
    {
        // weer een berekening en een return
    }

    public override void SetName(string newName)
    {
        // nieuwe naam instellen
    }
}

In de base class (Person) is CalculateAge géén virtual maar SetName wél.
De derived class (Male) heeft een new CalculateAge en een override SetName.

Mijn vraag is nu: wanneer doe je 'Person a = new Male();' en wanneer doe je 'Male a = new Male();'?

Dit is mijn verklaring:
Wanneer je 'Person a = new Male();' doet, dan gebruik je de non-virtual methodes van de base class (CalculateAge van Person) en de override methodes in de derived class (SetName van Male, aangezien SetName in Person virtual is).

Wanneer je 'Male a = new Male();' doet, dan gebruik je enkel methodes van de derived class. Dus dan ga je CalculateAge van Male gebruiken, en niet van Person.

Dus in de declaratie en instantiatie ga je bepalen hoevéél je nu eingelijk overerft?
Klopt dit een beetje?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan