[C#] Method overloading met subklassen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 13-06 23:19
Vraagje, welke van de methoden wordt aangeroepen? (oftewel: welke output krijg je?)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public void methode(Object o){
    println("Object!");
}
public void methode(Subklasse s){
    println("Subklasse!");
}

Object a = new Object();
Subklasse b = new Subklasse();
Object c = b;
methode(a);
methode(b);
methode(c);

Acties:
  • 0 Henk 'm!

  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 25-06 16:11
Object,
Subklasse
Object

En wat is hier het praktisch nut van?

[ Voor 44% gewijzigd door Xiphalon op 28-05-2010 11:50 ]


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 25-05 11:39
Ik zou zeggen
1. "Object"
2. "Subklasse"
3. "Subklasse"

Want:
1. a is een instance van Object
2. b is een instance van Subklasse
3. c is een instance van Subklasse (ook al is de variabele als Object gedeclareerd, je assigned nog steeds een Subklasse)

Maar ik weet het niet zeker hoor :)

maar waarom probeer je het niet gewoon?


EDIT
Nee, 3 moet uiteraard Object zijn 8)7

[ Voor 12% gewijzigd door NickThissen op 28-05-2010 11:55 ]

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Xiphalon
  • Registratie: Juni 2001
  • Laatst online: 25-06 16:11
Niet dus. c is gewoon een Object, en dus wordt Methode(Object o) aangeroepen.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 25-06 19:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dynamic dispatch werkt alleen op de 'this', niet op de overige parameters van de method. Je zou eens naar het Visitor pattern kunnen kijken, daarmee kun je dynamic dispatch op method parameters simuleren.

C#:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
class Base
{
    public virtual void visit(Visitor v)
    {
        v.accept(this);
    }
}

class Derived : Base
{
    public override void visit(Visitor v)
    {
        v.accept(this);
    }
}

interface Visitor
{
    void accept(Base b);
    void accept(Derived d);
}

class Printer : Visitor
{
    public void accept(Base b) { System.Console.WriteLine("Base"); }
    public void accept(Derived d) { System.Console.WriteLine("Derived"); }
}

public void bla()
{
    Base a = new Base();
    Derived b = new Derived();
    Base c = d;

    Printer p = new Printer();
    a.visit(p);
    b.visit(p);
    c.visit(p);
}

[ Voor 83% gewijzigd door .oisyn op 28-05-2010 12:23 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • dtech
  • Registratie: Juni 2005
  • Laatst online: 13-06 23:19
@.oisyn
dus dat print wel
Base
Derived
Derived?

Mooi pattern.

Maar dan is mijn vraag dus beantwoord, ik verwachtte het wel maar wist het niet zeker. Is er met C# (dat geloof ik late binding introduceerd) nog iets veranderd/een nieuwe manier gekomen?

En wat gebeurt er als je dit doet?
code:
1
2
3
dynamic a = new Object();
dynamic b = new Subklasse();
Object c = b;

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 25-06 19:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom stel je dat soort vragen terwijl je dat gewoon zelf kan lezen in de docs en zelf uit kan proberen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1